簡體   English   中英

按添加字段對查詢集進行排序

[英]Sort queryset by added field

我正在嘗試向查詢集的實例添加一個額外的字段,然后按新字段對集合進行排序。 但是我收到一個字段錯誤( Cannot resolve keyword 'foo' into field. Choices are: ...

我的觀點(摘要):

def view(request):
    instances = Model.objects.all()
    for counter, instance in enumerate(instances):
        instance.foo = 'bar' + str(counter)
    instances.order_by('foo')  #this line causes trouble
    return render(request, 'template.html', {'instances': instance})

我的模板:

{% for instance in instances %}
    {{instance.foo}}
{% endfor %}

如果我省略了order_by行,則模板將按預期方式渲染,因此該字段似乎在那里。

那么為什么會出現字段錯誤?
如果有人可以幫助我了解我在做錯什么,那將很棒。

提前致謝。


我找到了將模板更改為的可能解決方案

{% for instance in instances|dictsort:'foo' %}

而且效果很好,但是據我了解,視圖中的邏輯應該盡可能少,因此我認為應該在視圖中進行排序。
還是這實際上是正確的方法?

Django ORM旨在構建數據庫查詢。 結果,您只能查詢數據庫 “知道”什么。 您自己添加的方法,屬性或屬性對於數據庫是未知的。 因此, .order_by無效,因為您已“修補” instances集中的對象。

但是,如果您調用instances.order_by則會構造一個新的查詢集 此查詢集采用父級的上下文,因此表示(略微)修改的查詢 ,但還是一個查詢。 舊的查詢集是否已被評估或打補丁並不重要。

而且即使有一列foo ,也不會幫助,因為instance.order_by 責令instance查詢集,構建一個新的,一個看起來大約類似於舊的,只是行是有序的。

因此,您現在必須使用Python進行排序。 例如,您可以使用sorted(..)構造一個有序元素的列表,例如:

from operator import attrgetter

def view(request):
    instances = Model.objects.all()
    for counter, instance in enumerate(instances):
        instance.foo = 'bar' + str(counter)
    mydata = sorted(instances, key=attrgetter('foo'))
    return render(request, 'template.html', {'instances': mydata})

所以現在mydata不再是一個QuerySet ,但香草 list 此外請注意,數據庫中的排序可能與Python中的排序略有不同。 在Python中,如果並非所有元素都具有相同的類型,則可能會發生異常,此外,不能保證順序關系后面的語義完全相同。

Python對象中的new屬性在數據庫中不存在,僅在那些實例中不存在。 order_by更改查詢集,而不更改您當前存儲在內存中的對象列表。

一種方法是在視圖中使用內置的python排序功能,例如: sorted甚至list.sort()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM