Подтвердить что ты не робот

Запрос Django с четкими и order_by

У меня две модели

class Employer(models.Model):
     name = models.CharField(max_length=300, blank=False)
     id = models.IntegerField()
     status = models.IntegerField()
     eminence = models.IntegerField(null=False,default=4)

class JobTitle(models.Model)
     name = models.CharField(max_length=300, blank=False)
     employer = models.ForeignKey(Employer,unique=False,null=True)
     activatedate = models.DateTimeField(default=datetime.datetime.now)

Мне нужно, чтобы все работодатели были в порядке, срок действия которого активизировался последним.

Employer.objects.filter(status=1).order_by('eminence','-jobtitle__activatedate')

Этот запрос дает мне то, что я хочу, но он возвращает повторных работодателей, если работодатель имеет более одного названия работы.

Я бы использовал distinct(), но в документах Django я обнаружил, что

* Любые поля, используемые в вызове order_by(), включаются в столбцы SQL SELECT. Иногда это может привести к неожиданным результатам при использовании в сочетании с четкими(). Если вы заказываете по полям из родственной модели, эти поля будут добавлены в выбранные столбцы, и они могут сделать, что в противном случае повторяющиеся строки выглядят отчетливо. Поскольку дополнительные столбцы не отображаются в возвращаемых результатах (они существуют только для поддержки упорядочения), иногда кажется, что возвращаются неявные результаты. *

Хотя они объяснили мою проблему, решение не указано.

Мог бы дать мне предложение, как я могу группироваться по списку моих работодателей, не нарушая стабильность API?

4b9b3361

Ответ 1

Вы можете поместить в Employer класс свою последнюю дату активации JobTitle, а затем упорядочить это поле без использования отношений. [1] Компромисс здесь - это дублирование данных, и необходимость вручную обновлять дату активации должности работодателя вручную, когда соответствующий экземпляр JobTitle изменяется.

Кроме того, проверьте этот пост для другого решения, которое использует annotate().

Похожие вопросы:

[1] Queryset API distinct() не работает?