繁体   English   中英

如何使用Django ORM获取queryset作为联接查询的结果?

[英]How to get queryset as result for join Query using Django ORM?

我有下表和它们之间的关系。

class Customer(models.Model):    
    customer_id = models.BigIntegerField(unique=True, db_index=True)    
    email = models.CharField(max_length=200, blank=True,null=True)

class B(models.Model):
    customer_id = models.ForeignKey(Customer, to_field="customer_id", db_column="customer_id")
    status = models.CharField(max_length=200,blank=False, default="pending")

class C(models.Model):    
    customer_id = models.ForeignKey(Customer, to_field="customer_id", db_column="customer_id")
    engagement_rate = models.FloatField(default=0.0)

现在,我想创建分页Api以便从表Customer中获取每一行,并从表B和C中获取相关的详细信息。我在这两个表之间设置了foriegn键。 我已阅读此博客以进行加入查询,但无法申请我的案子。

请任何人都可以建议我解决这个问题的方法,以便在一个db调用中得到这些数据。

在单个查询中将不可能获取所有这些数据。 那么对服务器的单个查询就是如此。 但这是一个ORM查询。

Customer.objects.prefetch_related('c','b').filter(somecondition)

如果可以使用select_related,它将是一个SQL查询,但是由于外键关系是反向遍历的,因此您需要使用prefetch_related

另一方面,prefetch_related对每个关系进行单独的查找,并在Python中进行“联接”。 这使它可以预取多对多和多对一对象,除了select_related支持的外键和一对一关系外,还不能使用select_related来完成。

这仍然只是三个查询。

如果您真的很想在单个SQL查询中执行此操作。 Customer.objects.raw()是您的朋友。

尝试这个

Customer.objects.prefetch_related('b_set', 'c_set').filter(condition)

您不能在单个调用中完成此操作,但是您肯定可以使用prefetch_related在两个或三个中完成此操作。

A.objects.all().prefetch_related('B', 'C')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM