【问题标题】:How do I write a Django query to get distinct objects linked to another object?如何编写 Django 查询以获取链接到另一个对象的不同对象?
【发布时间】: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 对象,以便它们已经被水合为实际对象?

【问题讨论】:

    标签: python django django-queryset


    【解决方案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()
    

    我会将该查询放在AccountManager 的方法中,因为查询:“有待处理交易的帐户”自然与帐户相关联,而不是交易。

    【讨论】:

    • 仅供参考,无需编辑模型。 Django 的默认related_name{model}_set。不过,这是一种很好的做法。
    • @KeoniGarner 是的,您是对的,感谢您的注意。
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2016-07-18
    • 2013-05-03
    • 2023-02-04
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多