如何将临时属性添加到Django Querysets然后合并

时间:2016-05-25 20:48:09

标签: python django list filter django-queryset

所以我试图将一个临时属性添加到来自同一模型的两个单独的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

1 个答案:

答案 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>