Django ORM: построить запрос, который будет искать совпадения для поля в объекте в последней позиции поля многие ко многим - PullRequest
0 голосов
/ 27 января 2019

Я наткнулся на то, что сам не могу понять - во время фильтрации (в Django ORM) запроса я хотел бы запросить объекты, удовлетворяющие условию, что какое-то поле последнего объекта в списке из множества объектов равнок некоторому вкладу.Это может показаться не столь очевидным, поэтому ниже я привожу пример: Модель животного

class Animal(models.Model):
    name = models.TextField(null=True, blank=False)
    awards = models.ManyToManyField(Award, related_name='awards')

Модель награды

class Award(models.Model):
    name = models.TextField(null=False, blank=False)
    place = models.TextField(null=True, blank=True)
    date = models.DateTimeField(null=True)

    class Meta:
        ordering = ['date']

Имея этиклассы, я хотел бы построить запрос следующим образом:

Animal.objects.filter(awards__name__last='National Award')

Потому что Animal.objects.filter(awards__name='National Award') обычно возвращает (при использовании .values()) список, выглядящий так:

[{'name': u'National Award', 'place': u'capital', 'date': datetime.datetime(2018, 7, 13, 5, 2, 45, 23000), u'id': 1}, {'name': u'International Award', 'place': u'capital', 'date': datetime.datetime(2018, 10, 1, 1, 1, 55, 79000), u'id': 2}]

и для такихобъект, запрос будет пропускать его, поскольку «Национальная премия» не находится на последней позиции в списке, но если этот объект переключил бы эти записи, он будет возвращен этим запросом, поскольку последний объект name равен«Национальная премия».Я не хочу использовать поле date для этого запроса.

1 Ответ

0 голосов
/ 27 января 2019

Вы должны иметь возможность аннотировать дату последней награды, а затем фильтровать ее по названию и названию награды:

from django.db.models import F, Max

animals = Animal.objects.annotate(
    last_award_date=Max('awards__date')
).filter(
    awards__date=F('last_award_date'), awards__name='National Award'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...