我有下表和他们之间的关系。
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来进行加入查询,但无法申请我的案例。
请任何人都可以建议我使用它来获取单个数据库调用中的数据。
答案 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')