Python 组合两个查询集,公共字段具有不同的值
我在模型“ConsultantProfile”中搜索,相关性由“queryset1”中名为“rank”的字段表示 我还搜索相关模型,从“queryset2”中的相关模型中收集“ConsultantProfile”对象,并手动将它们设置为“0.7”,以便我可以合并查询集 当我想要组合和合并queryset1和queryset2时,公共对象具有不同的秩值。问题是在最终的“queryset”中,“rank”字段的值是来自第一个queryset的rank值,我无法为“rank”选择最高值 失败的解决方案 我试图通过手动迭代查询集和联合来解决这个问题,但没有任何改变Python 组合两个查询集,公共字段具有不同的值,python,django,django-queryset,Python,Django,Django Queryset,我在模型“ConsultantProfile”中搜索,相关性由“queryset1”中名为“rank”的字段表示 我还搜索相关模型,从“queryset2”中的相关模型中收集“ConsultantProfile”对象,并手动将它们设置为“0.7”,以便我可以合并查询集 当我想要组合和合并queryset1和queryset2时,公共对象具有不同的秩值。问题是在最终的“queryset”中,“rank”字段的值是来自第一个queryset的rank值,我无法为“rank”选择最高值 失败的解决方案
queryset = queryset1.none()
for obj in queryset1:
qs2_object_qs = queryset2.filter(id=obj.id)
# object presents in queryset2
if qs2_object_qs.exists():
# obj from queryset1 has better rank than queryset2 obj
if obj.rank >= qs2_object_qs.first().rank:k)
queryset |= queryset1.filter(id=obj.id)
queryset2 = queryset2.exclude(id=obj.id)
else:
queryset |= qs2_object_qs
# object does not present in queryset2
else:
queryset |= queryset1.filter(id=obj.id)
for obj in queryset2:
qs_object_qs = queryset.filter(id=obj.id)
# object presents in queryset
if qs_object_qs.exists():
# because compared mutual objects in previous loop and removed
pass
else:
queryset |= queryset2.filter(id=obj.id)
应在“|”操作数旁边使用union()。
在union方法中,重复的对象将不会删除。但在order('-rank')distinct()之后将不起作用
我所做的事情是在“|”操作数结果中找到了公共对象,并从其查询集中删除了秩较低的对象,然后使用union函数
temp_queryset = queryset1 | queryset2
for obj in temp_queryset:
try:
qs1_object = queryset1.get(id=obj.id)
qs2_object = queryset2.get(id=obj.id)
if qs1_object.rank > qs2_object.rank:
queryset2 = queryset2.exclude(id=obj.id)
else:
queryset1 = queryset1.exclude(id=obj.id)
except ConsultantProfile.DoesNotExist:
pass
queryset = queryset1.union(queryset2)
queryset = queryset.order_by('-rank')
temp_queryset = queryset1 | queryset2
for obj in temp_queryset:
try:
qs1_object = queryset1.get(id=obj.id)
qs2_object = queryset2.get(id=obj.id)
if qs1_object.rank > qs2_object.rank:
queryset2 = queryset2.exclude(id=obj.id)
else:
queryset1 = queryset1.exclude(id=obj.id)
except ConsultantProfile.DoesNotExist:
pass
queryset = queryset1.union(queryset2)
queryset = queryset.order_by('-rank')