如何编写Django查询获取与事务关联的去重Account实体对象
解决方案
你可以直接通过外键的反向关联查询Account模型,就能直接拿到实例化的Account对象集合,不需要基于Transaction查询后再手动转换:
最优实现(单次关联查询,效率最高)
class TransactionManager(models.Manager): def get_accounts_with_pending_transactions(self): """ 返回存在待处理交易的Account实例集合 """ return Account.objects.filter( transaction__status=Transaction.Status.PENDING ).distinct()
说明:
- 你原来的写法返回字典是因为调用了
values()方法,该方法的设计目的就是返回字典格式的字段值,不会实例化模型对象,所以只要避免用values()直接查询目标模型即可拿到实例。 transaction__status是利用Django外键的反向关联能力,直接通过Account查询关联Transaction的状态distinct()会自动对Account记录去重,最终返回的是标准的Account模型查询集,你可以直接访问实例的所有字段和方法- 如果你给
account外键自定义了related_name,把transaction__替换为你设置的related_name值加双下划线即可。
备选实现(逻辑更直观,适合关联逻辑复杂的场景)
如果你更习惯基于Transaction查询先拿到关联账户ID,再查询Account实例,可以用下面的写法:
class TransactionManager(models.Manager): def get_accounts_with_pending_transactions(self): """ 返回存在待处理交易的Account实例集合 """ # 先取所有待处理交易关联的去重账户ID pending_account_ids = self.filter( status=Transaction.Status.PENDING ).values_list("account_id", flat=True).distinct() # 用ID批量查询Account实例 return Account.objects.filter(id__in=pending_account_ids)
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

