Django查询按满足条件的所有内容排序,然后再按其他内容排序。

3

我有两个模型: CityContact

class City(models.Model):
    name = models.CharField(max_length=40)

class Contact(models.Model):
    name_surname = models.CharField(max_length=60)
    preference = models.IntegerField(default=0, choices=PREFERENCE)
    city = models.ManyToManyField(City)


给定一个城市“A”,我想查询我的数据库以获取按偏好排序的所有具有“ A”作为城市的联系人列表,然后是所有不具有“ A”作为城市的联系人列表。所以基本上,如果我的联系人表(姓名,城市,偏好)有如下内容,而我考虑的城市是纽约,则查询将返回: - Mike,NY,1 - Tom,NY,2 - Richard,SF,4 - John,LA,5
2个回答

1
这似乎是有效的:


qs1 = Contact.objects.filter(city__name="NY")
qs2 = Contact.objects.exclude(city__name="NY").order_by("city")

qs1.union(qs2, all=True)

有可能你不需要使用all=True,我在测试中需要它。

union()文档


0

试试这个:

from django.db.models import Exists, OuterRef


Contact.objects.annotate(
    has_ny=Exists(
        City.objects.filter(name='NY', contact=OuterRef('pk'))
    )
).order_by('-has_ny', 'preference')

检查联系人是否有任何名为“NY”的城市,并注释一个布尔标志。出现了什么新错误? - Brian Destura
与之前相同,它无法识别关键字。 - giaggi
基本上与上面相同,只是键不同-->FieldError: 无法将关键字“contact”解析为字段。选项包括:地址、呼叫表、联系人、ID、职位、项目、纬度、经度、名称、所有者、所有者ID、状态。什么是 contact=OuterRef('pk')? - giaggi
我在我的端上尝试了一下,运行良好。你可以尝试使用 contact__pk=OuterRef('pk')) - Brian Destura
contact=OuterRef('pk') 是从外部查询集中引用城市过滤器中的联系人。 - Brian Destura
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接