【发布时间】:2016-06-17 19:13:12
【问题描述】:
Django 1.8 和 1.9,Postgres 数据库。
我有一个Contest 模型,它可以包含Users 提交的许多相关Entry 对象。
class Contest(models.Model):
title = models.CharField(max_length=50)
class Entry(models.Model):
contest = models.ForeignKey(Contest, related_name="entries")
user = models.ForeignKey(settings.AUTH_USER_MODEL)
我想获取所有Contest 对象的列表,并用complete 标志进行注释,指示特定user 是否为每个Contest 提交了Entry。
from django.db.models import Case, When, BooleanField, Value
user = User.objects.get(...)
contests = Contest.objects.annotate(
complete=Case(
When(entries__user=user, then=Value(True)),
default=Value(False),
output_field=BooleanField(),
)
)
contests 上的预期结果将是这样的(对于 user1):
但是,我得到的重复元素取决于每个 Contest 上的 Entries 数量(注意竞赛 4 和 5):
此时,我尝试将distinct() 添加到查询集的末尾,但由于考虑到新的complete 注释,我仍然会收到Contest 4 的重复项。
由于我使用 Django >= 1.8 并使用 Postgres,因此我想到了使用 distinct("id")。可悲的是,这在Contest 4 中设置为False。
这就是我决定发布这个问题的部分。关于如何从当前结果到预期结果(第一个表)的任何指示?通过使用条件注释,我是否大大忽略了某些东西?
【问题讨论】:
标签: python django postgresql django-queryset django-orm