...并返回意外结果(在Django 1.6.5中)
我的models.py
class Member(models.Model):
...
class Donation(models.Model):
year = models.PositiveSmallIntegerField()
cheque_amount = models.DecimalField(default=0, max_digits=8, decimal_places=2)
donor = models.ForeignKey(Member)
...
class SpecialTitle(models.Model):
chair_title = models.CharField(max_length=128, blank=True)
member = models.OneToOneField(Member)
...
我想在我的一个管理过滤器中使用两个查询集的联合
donors = queryset.filter(
donation__year__exact=2014
).annotate(sum_donation=Sum('donation__cheque_amount')).filter(sum_donation__gte=1000)
chairs = queryset.filter(specialtitle__chair_title__iendswith='Chair')
这是令人费解的部分(在Django经理shell中)
>>> donors | chairs == chairs | donors
False
>>> donors.count(); chairs.count()
189
17
>>> (donors | chairs).count(); (chairs | donors).count()
193
291
>>> (donors | chairs).distinct().count(); (chairs | donors).distinct().count()
193
207
并且没有一个是正确的结果。我希望设置操作
>>> set(donors) | set(chairs) == set(chairs) | set(donors)
True
>>> set(donors) & set(chairs) == set(chairs) & set(donors)
True
>>>
他们会返回正确的结果。但是,Django管理过滤器需要QuerySet,而不是python集(或列表)
这是为什么?如何在带注释的过滤器之后获得Django QuerySet(相同类型)的正确联合? 谢谢。
答案 0 :(得分:0)
似乎我别无选择,只能使用python set union运算符并再次点击数据库以获得所需的结果。
donors = queryset.filter(
donation__year__exact=2014
).annotate(sum_donation=Sum('donation__cheque_amount')).filter(sum_donation__gte=1000)
chairs = queryset.filter(specialtitle__chair_title__iendswith='Chair')
result = queryset.filter(pk__in=[person.id for person in set(donors) | set(chairs)])