【问题标题】:Join with more than one, specific one-to-many rows加入多个特定的一对多行
【发布时间】:2017-04-13 14:29:01
【问题描述】:

我必须将表 Type1 中的一行与表 Type2 中的两行连接起来。有数据库的示例模型:

class Type1(models.Model):
    name = models.CharField(max_length=300)

class Type2(models.Model):
    foreign = models.ForeignKey(Type1)
    name = models.CharField(max_length=50)
    value = models.IntegerField()

在 SQL 中,查询如下所示:

SELECT A.name, B.value, C.value 
FROM Type1 A, Type2 B, Type2 C 
WHERE B.foreign = C.foreign = A.id 
AND B.name = _VAR1_ AND C.name = _VAR2_

如何使用 Django 方法(不是原始 SQL!)进行查询?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    不确定我是否正确理解了您的问题,并且对 SQL 知之甚少,无法理解 SQL 代码。

    解释 1 是您想要一个反向关系查询和一个用于 OR 部分的 Q 对象。请参阅this 页面中的“跨越关系的查找”和“使用 Q 对象的复杂查找”。

    例如

    Type1.objects.filter(Q(type2__name = '_VAR1_' | type2__name = '_VAR2_'))
    

    这将返回模型 Type1 的所有行,该模型具有关联的 Type2 行,名称为 VAR1VAR2

    解释2:你要定义关系。 嗯,这更容易。您有一个 Type1 行,并希望将另外两行与这一行相关联。 查询 Type1 行并将其保存到变量中。

    t1 = Type1.object.get(id = X)
    

    然后使用外键中的t1对象创建type2对象:

    t2 = Type2(foreign = t1, name = 'whatever', value = 'value')
    t2.save()
    

    其他对象也一样

    t3 = Type2(foreign = t1, name = 'whatever2', value = 'value2')
    t3.save()
    

    如果我误解了问题,请告诉我。

    干杯。

    【讨论】:

    • 感谢您的回复。我将描述我的问题:对于每个 ,只有一个 和一个 。我想接收包含所有信息的表(QuerySet)。它应该有以下列(元素?) - [x.name, y1.value, y2.value]
    • 类似于 Type2.objects.filter(type2__name=_VAR1_).values('name', 'type2__value') 和 Type2.objects.filter(type2__name=_VAR2_).values('name', ' type2__value') 组合
    • 所以你知道 之前的对吗?进行查询并将其保存到变量中:t1 = Type1.objects.get(id = x)。接下来对 Type2 进行查询以返回两行:t2 = Type2.objects.filter(Q(foreignkey = t1, name = VAR1 | foreignkey = t1, name = VAR2) )。如果您只有两个关联,如您所说,这将返回一个包含您想要的两行的列表。您的最终列表将是 [t1.name, t2[0].value,t2[1].value]。
    • 我想要一组该列表(或任何其他容器)。所以 [t1.name, t2[0].value,t2[1].value] 不仅适用于一个 t1,而且适用于 Type1 的每个元素。
    • 我认为 for 循环可以解决这个问题,对吧? result = [] /n for el in Type1.objects.all(): /n t = Type2.objects.filter(Q(foreignkey = el, name = VAR1 | foreignkey = el, name = VAR2) ) /n result.append ([el.name, t[0].value,t[1].value]) .
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 2016-04-09
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多