Как написать запрос в Django, чтобы получить отдельные объекты, связанные с другим объектом?

Я использую Python 3.9 и Django 3.2. У меня есть класс, в котором есть поле для другого ...

class Transaction(models.Model):
    ...

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    account = models.ForeignKey('Account', on_delete=models.CASCADE)

Я хотел бы получить отдельный набор объектов Account, связанных с определенными транзакциями, поэтому я создал следующее

class TransactionManager(models.Manager):
    def get_accounts_with_pending_transactions(self):
        """
        Returns acounts with pending transactions
        """
        return Transaction.objects.filter(status=Transaction.Status.PENDING).values("account").annotate(n=models.Count("pk"))
...

Однако, похоже, что вышеприведенный метод возвращает список dicts, а не объектов. Таким образом, у меня нет доступа ко всем полям из объектов Account. Есть ли способ написать запрос для получения объектов Account таким образом, чтобы они уже были гидратированы как реальные объекты?

Я бы использовал обратное отношение, сначала отредактируйте вашу модель:

class Transaction(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    account = models.ForeignKey('Account', related_name='transactions', on_delete=models.CASCADE)

Тогда вы можете написать такой запрос:

accounts_with_pending_transactions = Account.objects.filter(transactions__status=Transaction.Status.PENDING).distinct()

Я бы поместил этот запрос в метод Manager из Account, потому что запрос: "счета с отложенными транзакциями" естественно привязан к счетам, а не к транзакциям.

Вернуться на верх