Получите "одну" сторону отношения OneToMany без повторных записей в настраиваемом диспетчере. - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь получить сторону one отношения OnetoMany, но эта операция обусловлена ​​некоторыми критериями, которым должна соответствовать сторона many:

Пример

# one side
class Car(models.Model):

# many side
class Obligation(models.Model):
    car = models.ForeignKey(to=Car, on_delete=models.CASCADE)
    expiration_date = models.DateField(default=date.today)

То, что я ищу, - это получить все те Car с Obligation, чьи expiration_date истекли, для следующего я создал manager для выполнения этой операции:

from datetime import date

TODAY = date.today()


class CarManager(models.Manager):
    """Define a manager for Car model."""

    def with_obligations_expired(self) -> "QuerySet[Car]":
        """Get those cars whose obligations are expired."""
        return self.get_queryset().filter(
            obligation__expiration_date=TODAY
        )

Проблема

Если один Car имеет 2 или 3 Obligation, при запуске Car.objects.with_obligations_expired() вы получите:

<QuerySet [<Car: car1>, <Car: car1>, <Car: car1>]>

Результатом является список Queryset с повторяющимися записями об автомобилях, поскольку многие обязательства принадлежат одному автомобилю, тогда каждое обязательство возвращает принадлежащий ему автомобиль. но мне нужен список без повторяющихся записей.

То есть мне нужно получить список тех автомобилей с просроченными обязательствами без повторных записей.

1 Ответ

2 голосов
/ 03 августа 2020

Вы можете использовать .distinct() [Django -doc] , чтобы вернуть тот же объект один раз:

from datetime import date

class CarManager(models.Manager):
    """Define a manager for Car model."""

    def with_obligations_expired(self) -> "QuerySet[Car]":
        """Get those cars whose obligations are expired."""
        return self.get_queryset().filter(
            obligation__expiration_date__lte=date.today()
        )<b>.distinct()</b>

Таким образом, этот набор запросов вернуть Car при наличии по крайней мере одного Obligation с истекшим сроком действия.

Вы можете использовать __lt поиск [ Django -doc] или __lte поиск [Django -doc] для фильтрации таким образом, чтобы срок действия был до сегодня.

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