Как написать запрос в 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
, потому что запрос: "счета с отложенными транзакциями" естественно привязан к счетам, а не к транзакциям.