所以我正在进行一个如下所示的查询:
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
获取这些对象的查询集而无需循环。 这可能吗?
答案 0 :(得分:1)
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数据库。
但以下情况可能
查询所有项目到queryset q1
查询对查询集q2
采取差异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
值对应一个对象。