[英]How to query a model by a related object and get the related object in the queryset using the Django ORM
[英]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.