Django запрос сортировки по всем удовлетворяющим условию, а затем по всем остальным
I have two models City
and Contact
.
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" я пытаюсь запросить мою БД, чтобы получить список
- All contacts that have "A" as a city order by preference
- And after that all contacts that don't have "A" as a city order by preference
В принципе, если бы в моей таблице контактов (имя, город, предпочтения) было что-то вроде
- Tom,NY,2
- John, LA, 5
- Mike, NY, 1
- Richard, SF, 4
если город, который я рассматриваю, - Нью-Йорк, запрос выдаст:
- Mike, NY, 1
- Tom,NY,2
- Richard, SF, 4
- John, LA, 5
Кажется, это работает:
qs1 = Contact.objects.filter(city__name="NY")
qs2 = Contact.objects.exclude(city__name="NY").order_by("city")
qs1.union(qs2, all=True)
Возможно, вам не понадобится all=True
. Мне он понадобился для моего теста.
Попробуйте это:
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')