如何使用Django ORM将queryset作为连接查询的结果?

时间:2016-05-19 07:53:01

标签: python django django-rest-framework

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

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来从表中获取每一行 客户及其与表B和C中的相关详细信息。我已在此表之间设置了foriegn密钥。我已阅读此blog来进行加入查询,但无法申请我的案例。

请任何人都可以建议我使用它来获取单个数据库调用中的数据。

3 个答案:

答案 0 :(得分:1)

无法在单个查询中获取所有这些数据。那么对服务器的单个查询就是。但它只是一个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()是你的朋友。

答案 1 :(得分:1)

试试这个

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

答案 2 :(得分:0)

您无法在一次通话中执行此操作,但您当然可以使用prefetch_related在两次或三次中执行此操作。

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