【问题标题】:SQL statement INNER JOIN to Django ORMSQL 语句 INNER JOIN 到 Django ORM
【发布时间】:2021-07-18 13:27:12
【问题描述】:

我是 Django 新手,但我的 sql 工作正常。我想知道如何在 Django 中进行这样的查询

我有带连接的 SQL 语句

select a.id,
       b.id
from model.a 
join model.b on model.b.a_id=model.a.id
where 'need to find'=Any(a.info);

型号:

class A(models.Model):
    name = models.CharField(max_length=200)
    info = models.ArrayField()

class B(models.Model):
    name = models.CharField(max_length=200)
    a = models.ForeignKey('A', related_name='a', on_delete=models.CASCADE)

【问题讨论】:

  • =Any(a.info) 应该做什么?
  • 请注意,通常 Django 查询会返回 objects 的查询集,而不是元组。虽然这是可能的,但它不是很优雅。可能在这里您想要获取 .a 已填写的 B 对象,这样只需一个查询即可获取匹配的 B 模型对象,以及相应的 A 对象。
  • 使用ArrayField 也不是一个好主意:数据库规范化规则基本上希望将复合值转换为单独的表并链接到该模型:en.wikipedia.org/wiki/Database_normalization
  • queriesin django 开头,您可能想专门寻找lookups-that-span-relationship
  • 你不加入 Django,Django 为你加入。请用你自己的话解释你想用你的模型做什么

标签: python django


【解决方案1】:

您可以.filter(…) [Django-doc] 使用:

B.objects.filter(<b>a__info__contains=['need to find']</b>).select_related('a')

可以使用双下划线 (__) 来查看“通过”关系。

这将返回QuerySetB 对象,其中A 对象在同一查询中加载。因此有可能两个B 对象引用同一个A 对象。

我们在这里使用__contains lookup [Django-doc] 来检查'need to find' 是否是数组info 的一个项目。

然而,建模没有有效地标准化。在规范化的数据库中,通常数组等由一个额外的模型和ForeignKeys 建模,这使得数据库更小、更高效,并且通常更可预测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多