如何编写 Django 查询以获取链接到另一个对象的不同对象?
How do I write a Django query to get distinct objects linked to another object?
我正在使用 Python 3.9 和 Django 3.2。我有这个 class,它有一个字段用于另一个 ...
class Transaction(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
account = models.ForeignKey('Account', on_delete=models.CASCADE)
我想获得一组不同的帐户对象,链接到某些交易。所以我尝试了这个
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"))
...
但是,上面的内容似乎是 return 与对象相对的字典列表。因此,我无权访问我的帐户对象中的所有字段。有没有什么方法可以编写查询来获取帐户对象,以便它们已经作为实际对象被水合?
我会使用反向关系,首先编辑您的模型:
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
的方法中,因为查询:“具有待处理交易的帐户”自然与帐户相关联,而不是与交易相关联。
我正在使用 Python 3.9 和 Django 3.2。我有这个 class,它有一个字段用于另一个 ...
class Transaction(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
account = models.ForeignKey('Account', on_delete=models.CASCADE)
我想获得一组不同的帐户对象,链接到某些交易。所以我尝试了这个
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"))
...
但是,上面的内容似乎是 return 与对象相对的字典列表。因此,我无权访问我的帐户对象中的所有字段。有没有什么方法可以编写查询来获取帐户对象,以便它们已经作为实际对象被水合?
我会使用反向关系,首先编辑您的模型:
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
的方法中,因为查询:“具有待处理交易的帐户”自然与帐户相关联,而不是与交易相关联。