django - 如何在 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 文档:
选择相关()
返回一个 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')
推荐阅读
- .net - 从 Web 浏览器使用客户端 Web 服务是一种好的做法吗?
- java - 内部连接器错误 (1002) - 调用线程在等待响应解除阻塞时超时
- c# - Xamarin Forms 4.8.0.x 媒体插件异步问题
- verilog - 七段显示器输出未知
- javascript - Nest 无法解析 AuthService 的依赖项(AuthRepository,?)
- docker - 从 docker-compose.yml 将参数传递到 docker 容器
- ios - React Native 按住,将手指拖动到另一个可触摸并通过该视图捕获触摸
- python - 标量乘法 Numpy
- .net-core - .NET Core for Windows 不支持密码解密?
- mongodb - 使用凭据启动 MongoDb 测试容器