如何编写 Django 查询以获取链接到另一个对象的不同对象?
Posted
技术标签:
【中文标题】如何编写 Django 查询以获取链接到另一个对象的不同对象?【英文标题】:How do I write a Django query to get distinct objects linked to another object? 【发布时间】:2022-01-09 12:13:55 【问题描述】:我正在使用 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"))
...
但是,上面似乎返回了一个字典列表,而不是对象。因此,我无权访问我的 Account 对象中的所有字段。有没有办法编写查询来获取 Account 对象,以便它们已经被水合为实际对象?
【问题讨论】:
【参考方案1】:我会使用反向关系,首先编辑你的模型:
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()
我会将该查询放在Account
的Manager
的方法中,因为查询:“有待处理交易的帐户”自然与帐户相关联,而不是交易。
【讨论】:
仅供参考,无需编辑模型。 Django 的默认related_name
是model_set
。不过,这是一种很好的做法。
@KeoniGarner 是的,您是对的,感谢您的注意。以上是关于如何编写 Django 查询以获取链接到另一个对象的不同对象?的主要内容,如果未能解决你的问题,请参考以下文章
编写一个 django 查询并在一次数据库中获取反向相关对象!
Django 查询:返回一个将转换为“AND (...)”的 Q 对象