如何编写 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()

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

【讨论】:

仅供参考,无需编辑模型。 Django 的默认related_namemodel_set。不过,这是一种很好的做法。 @KeoniGarner 是的,您是对的,感谢您的注意。

以上是关于如何编写 Django 查询以获取链接到另一个对象的不同对象?的主要内容,如果未能解决你的问题,请参考以下文章

编写一个 django 查询并在一次数据库中获取反向相关对象!

Django 查询:返回一个将转换为“AND (...)”的 Q 对象

添加自定义按钮以链接到另一个模型 Django Admin

Django:如何编写查询以使用多列进行排序,通过模板显示

子查询 django 查询以从对象中获取最大的不同值并返回这些对象

如何编写查询以在 django 的 json 字段中查找值