Django跨多外键关联查询:如何获取当前登录用户可访问的Bill对象
实现方案
首先你的模型定义存在缺失项:CustomerUser 到 Customer 的外键字段没有声明,和你提供的ER图对应不上,需要先补全该字段才能正常进行关联查询:
class CustomerUser(models.Model): first_name = models.CharField(max_length=30, blank=True, null=True) last_name = models.CharField(max_length=30, blank=True, null=True) user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True) # 补全ER图中指向Customer的外键字段 customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True, null=True)
单条QuerySet查询代码
可以单条QuerySet实现需求,基于Django的双下划线跨关联查询语法,假设当前登录用户为request.user,查询语句如下:
# 基础查询 accessible_bills = Bill.objects.filter(customer__customeruser__user=request.user) # 如果存在同一个Customer绑定多个同用户CustomerUser的场景,可加distinct去重 accessible_bills = Bill.objects.filter(customer__customeruser__user=request.user).distinct()
查询逻辑说明
customer__customeruser表示从Bill表出发,通过外键关联到Customer表,再通过Customer到CustomerUser的反向外键关联到CustomerUser表__user=request.user表示筛选关联的CustomerUser绑定的用户等于当前登录用户的记录,最终返回符合条件的所有Bill对象
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

