Левое соединение в Django с тремя моделями
Я новичок в Django и не знаю, как делать джойны. У меня есть следующие модели и соответствующие им таблицы:
class ModelA(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
class ModelB(models.Model):
id = models.AutoField(primary_key=True)
a_id = models.ForeignKey(ModelA, on_delete=models.CASCADE)
c_id = models.ForeignKey(ModelC, on_delete=models.CASCADE)
extra = models.CharField(max_length=30)
class ModelC(models.Model):
id = models.AutoField(primary_key=True)
number = models.CharField(max_length=30)
ModelA -> Table a: id, name
ModelB -> Table b: id, a_id, c_id, extra
ModelC -> Table c: id, number
Я хочу выполнить это левое соединение:
SELECT a.*, b.extra, c.number
FROM a
LEFT JOIN b ON a.id = b.a_id
LEFT JOIN c ON c.id = b.c_id
Я не знаю, как это сделать, и возможно ли это вообще.
Relationship работает следующим образом.
ModelB
/\
/ \
/ \
ModelA ModelC
Итак, ModelB
- это родительская модель.
Попробуйте выполнить запрос, как показано ниже.
Qa = ModelA.objects.all().values_list('id', flat=True)
Qc = ModelC.objects.all().values_list('id', flat=True)
Query = ModelB.objects.all().filter(a_id__in=Qa).filter(c_id__in=Qc)
А когда обращаетесь к атрибутам, попробуйте сделать так, как показано ниже.
{% for i in Query %}
{{ i.extra }}
{{ i.a_id.name }}
{{ i.c_id.number }}
{% endfor %}
Вы можете использовать этот запрос:
ModelA.objects.all().values('id', 'name', 'modelb__extra', 'modelb__c_id__number')
но лучше использовать a и c вместо a_id и c_id в вашей ModelB.