Django запрос с отчетливым и order_by - PullRequest
16 голосов
/ 11 июля 2011

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

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. Иногда это может привести к неожиданным результатам при использовании в сочетании с different (). Если вы упорядочите по полям из связанной модели, эти поля будут добавлены в выбранные столбцы, и в противном случае дублирующиеся строки могут казаться отличными. Поскольку дополнительные столбцы не отображаются в возвращаемых результатах (они предназначены только для поддержки упорядочения), иногда кажется, что возвращаются нечеткие результаты. *

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

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

1 Ответ

8 голосов
/ 11 июля 2011

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

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

Смежные вопросы:

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

...