Левое соединение в 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.

Вернуться на верх