【问题标题】:django select all connected valuesdjango 选择所有连接的值
【发布时间】:2012-08-31 02:57:52
【问题描述】:

Djnago 模型:

class RootTable(models.Model):
    id = models.IntegerField(primary_key=True)
    field1 = models.CharField(max_length=100, unique=True)
    field2 = models.CharField(max_length=120, unique=True)

class SubTableA(models.Model):
    id = models.IntegerField(primary_key=True)
    field1 = models.ForeignKey(RootTable, null=True, blank=True)
    subtableAfield1 = models.CharField(max_length=180, blank=True)

class SubTableB(models.Model):
    id = models.IntegerField(primary_key=True)
    field1 = models.ForeignKey(SubTableA, null=True, blank=True)
    subtableBfield1 = models.CharField(max_length=180, blank=True)

class SubTable2(models.Model):
    id = models.IntegerField(primary_key=True)
    field1 = models.ForeignKey(RootTable, null=True, blank=True)
    subtable2field1 = models.CharField(max_length=180, blank=True)
    subtable2field2 = models.CharField(max_length=180, blank=True)


如果我使用这样的请求:

RootTable.objects.filter( subtable2__subtable2field1 = 'text' )

它仅从“RootTable”返回值。
SQL:

SELECT  'roottable'.'id',
        'roottable'.'field1',
        'roottable'.'field2',
FROM 'roottable'
INNER JOIN ...

但是如何从其他表中获取所有连接的值?
SQL:

SELECT  'roottable'.'id',
        'roottable'.'field1',
        'roottable'.'field2',
        'subtablea'.'subtableafield1',
        'subtableb'.'subtablebfield1',
        'subtable2'.'subtable2field1',
        'subtable2'.'subtable2field2',
FROM 'roottable', 'subtablea', 'subtableb', 'subtable2'
INNER JOIN ...

更新

我收到类似这样的回复:

[
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : 'value1' },
...
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : 'value2' },
]

但我需要这样的东西:

[
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : ['value1','value2'] },
]

有没有快速获得这种结构的方法?

【问题讨论】:

    标签: django model


    【解决方案1】:

    Django filter() 查询返回对象而不是特定属性。但是,您可以使用values() 仅返回属性字典。这也可以取相关字段的属性。

    但副作用是您必须传递要返回的属性名称(类似于 SQL)。

    因此您可以将查询更改为

    RootTable.objects.filter(subtable2__subtable2field1='text').values('field1', 
        'field2', 'subtablea__subtable1field1', 'subtableb__subtable2field1')
    

    更多参考Django Queryset values

    【讨论】:

    • 谢谢。你说得对。我曾尝试使用“values()”,但一开始我收到类似“这样的列不存在”的错误。所以我改变了模型中字段的类型,它有所帮助。但是当我回到模型的旧结构时,项目继续工作。也许你可以帮助我解决这个问题的其他部分(见更新)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2014-05-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多