Djnago model:
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)
If I use request like this:
RootTable.objects.filter( subtable2__subtable2field1 = 'text' )
It returns values only from ‘RootTable’.
SQL:
SELECT 'roottable'.'id',
'roottable'.'field1',
'roottable'.'field2',
FROM 'roottable'
INNER JOIN ...
But how can I get all connected values from other tables?
SQL:
SELECT 'roottable'.'id',
'roottable'.'field1',
'roottable'.'field2',
'subtablea'.'subtableafield1',
'subtableb'.'subtablebfield1',
'subtable2'.'subtable2field1',
'subtable2'.'subtable2field2',
FROM 'roottable', 'subtablea', 'subtableb', 'subtable2'
INNER JOIN ...
UPDATE:
I receive a response something like this:
[
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : 'value1' },
...
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : 'value2' },
]
But I need something like this:
[
{ 'roottable.id' : 'rid'},
{ 'subtablea.id' : 'id'},
{ 'subtablea.subtableafield1' : ['value1','value2'] },
]
is there a fast way to get such structure?
Django
filter()query returns objects not the specific attributes. However, you can usevalues()to return just attributes dict. This can also take attributes of related field.But the side-effect is you have to pass attribute names that you want to get back (similar to SQL).
So you can change your query as
More reference at Django Queryset values