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. Мне он понадобился для моего теста.

Документы по union()

Попробуйте это:

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')
Вернуться на верх