Django非独特查询

时间:2014-01-24 19:18:12

标签: python django django-queryset

所以我正在进行一个如下所示的查询:

queryset = FooBar.objects.filter(example__pk__lt=50)

其中example是外键。因此,这将获得连接到前50个FooBar之一的所有Example个对象。但这是我的目标:

我希望此查询集仅包含 FooBar个对象,其中不同的字段,例如target不是

我可以通过以下循环来做到这一点:

target_ids = [] #holding a check list for comparison
correct_targets = [] #holding the objects I want to have
for item in queryset: #iteration
    target_ids.append(item.example.pk) #send primary key to check list
    if target_ids.count(item.example.pk) == 2: #check if there has been more than one (if there is more than two I don't send another correct target since I would have already sent it previously)
        correct_targets.append(item) #send correct target

我希望有一种方法可以从我的queryset获取这些对象的查询集而无需循环。 这可能吗?

4 个答案:

答案 0 :(得分:1)

可以使用filtering on annotation

from django.db.models import Count
qs = FooBar.objects.filter(example__pk__lt=50)
qs = qs.annotate(num_examples=Count('example')).filter(num_examples__gt=1)

答案 1 :(得分:0)

我不确定Django ORM是否可以使用“反向不同”,甚至不能使用基础SQL数据库。

但以下情况可能

  1. 查询所有项目到queryset q1

  2. 查询对查询集q2

  3. 的项目
  4. 采取差异qs_not_distict = qs1.exclude(pk__in=qs2)

答案 2 :(得分:0)

您可以使用聚合查询来获取非同类商品的列表,然后使用它来过滤您的其他查询。

nondistinct = Example.objects.values('target').annotate(Count('id')).filter(id__count__gt=1)
Foobar.objects.filter(example__pk__lt=50).filter(example__target__in=[item['target'] for item in nondistinct])

答案 3 :(得分:0)

只需在您的 value 模型中的任何非字典字段 FK 上进行注释:

from django.db.models import F
....

qs = FooBar.objects.filter(example__pk__lt=50).annotate(example_target=F(example__target))

此查询将包含重复的 FooBar 对象,每个新的 target 值对应一个对象。