Python 如何使用Django ORM将queryset作为联接查询的结果?
我有下表和它们之间的关系Python 如何使用Django ORM将queryset作为联接查询的结果?,python,django,django-rest-framework,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(Cus
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中的客户及其相关详细信息。我已在这两个表之间设置了外键。我读过这篇文章做加入查询,但没能申请我的案例
请任何人都可以建议我在一次db调用中获取此数据的方法。您不能在一次调用中完成此操作,但您肯定可以在两次或三次调用中使用
预回迁相关的
完成此操作
A.objects.all().prefetch_related('B', 'C')
不可能在一个查询中获取所有这些数据。对服务器的一个查询就是。但这是一个单一的ORM查询
Customer.objects.prefetch_related('c','b').filter(somecondition)
如果您可以使用select_related,那么它将是一个SQL查询,但是因为外键关系是反向遍历的,所以您需要使用
另一方面,prefetch_-related对每个
关系,并在Python中执行“连接”。这使得它能够
预取多对多和多对一对象,这是无法完成的
除了外键和一对一外,使用select_related
select\u相关支持的关系
这仍然只是三个问题
如果您真的很想在一个SQL查询中实现这一点Customer.objects.raw()
是您的朋友。试试这个
Customer.objects.prefetch_related('b_set', 'c_set').filter(condition)
你到底想加入什么?这里的目标是什么?我认为您查看的博客很旧,并且有其他方法可以使用.anotate()操纵querystry。谢谢您的回答。我遇到此异常
在客户对象上找不到'b','b'是预取\u related()的无效参数。
我实际创建了模型并尝试了查询。我打赌你的真实模型不是名字B和C:-)你是对的,真实模型有不同的名字。我试过用我的真名模特。但不起作用。不管你给了我什么指导,我都会设法找到解决办法。最后发生了什么?我使用了Customer.objects.raw()
。它解决了我的问题@谢谢你的建议。我会试试你的建议。