首页 > 解决方案 > 如何在 Django 中查询两个以上的表?

问题描述

我想对多个表进行大查询。我的模型会写在下面,里面有 5 个ForeignKeys,也就是我会碰 5 个表。

  class Transaction(models.Model):
    id = models.BigIntegerField(blank=True, null=False, primary_key=True)
    currency = models.ForeignKey(Currency, null=True, on_delete=models.CASCADE)
    deal = models.ForeignKey(Deal, null=True, related_name='deal', on_delete=models.CASCADE)
    service_instance = models.ForeignKey(ServiceInstance, null=True, on_delete=models.CASCADE)
    payment_source = models.ForeignKey(PayerPaymentSource, null=True, on_delete=models.CASCADE)
    payment_date = models.DateTimeField(blank=True, null=True)
    amount = models.IntegerField(blank=True, null=True)
    status = models.CharField(max_length=255, blank=True, null=True)
    context = models.TextField(blank=True, null=True)

此外,PayerPaymentSource包含ForeignKey.And 需要将来自它的另一个请求,如select_related()

如何实现这样的查询?

标签: django

解决方案


根据 Django 文档:

选择相关()

返回一个 QuerySet,它将“遵循”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

以下示例说明了普通查找和 select_related() 查找之间的区别。这是标准查找:

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

这是 select_related 查找:

# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog

实际上回答了这个问题:

为了一次选择所有外键关系,您需要在select_related. 如果您想遵循两级或更多级别的外键关系,则需要使用__符号指定它,如下所示:foreignKey_fied__itsForeignKey.

所以你需要使用这样的东西:

Transaction.objects.select_related('currency', 'deal', 'service_instance', 'payment_source__itsForeignKeyField')

推荐阅读