所以我试图将一个临时属性添加到来自同一模型的两个单独的QuerySet中,但似乎只要我尝试将它们合并在一起,新字段就会消失。
示例:
class IndexView(View):
def get(self, request):
q1 = MyModel.objects.filter(points=0)
q2 = MyModel.objects.filter(points=100)
for q in q1:
q.title = 'Loser'
print(q.title) # Prints 'Loser'
for q in q2:
q.title = 'Winner'
print(q.title) # Prints 'Winner'
q = q1 | q2 # Merges the two QuerySets together
for item in q:
print(item.title) # ERROR: "Title" is not a field anymore apparently...
return render(request, 'index.html', {})
我尝试了另一种使用.chain()
的方法(在另一个帖子中提到),但这会将类型从QuerySet
更改为List
,这是我不想要的。我将在下面发布。有没有办法将列表保持为QuerySet,同时获得相同的结果?请注意,我希望title
属性是临时的,因此我可以将模板中的项目分开。此外,points
过滤器不是实际过滤器,实际上要复杂得多,因此模板标签和模型方法不是一种选择。
from itertools import chain
feed = sorted(
chain(q1, q2),
key=lambda instance: instance.created)
Django v1.9.6
Python v3.4.3
答案 0 :(得分:0)
你无法做到这一点,因为当你这样做时:
q = q1 | q2
您正在执行新的数据库查询。没有直截了当的方法,你只能一起查询它们然后分别标记:
queryset = MyModel.objects.filter(Q(points=0) | Q(points=100))
for item in queryset:
if q.points == 0:
q.title = 'Loser'
elif q.points == 100:
q.title = 'Winner'
鉴于你可能对points
有复杂的条件,你也可以为模型MyModel
创建一个方法,然后调用该函数返回一个类似于赋值title
的值。 / p>