Django Выберите из трех моделей с критериями фильтрации - PullRequest
0 голосов
/ 02 августа 2020

У меня есть три модели:

class Vehicle(models.Model):
    Vehicle_ID = models.AutoField('ID', primary_key= True)
    Vehicle_VIN = models.CharField('FIN', max_length=30)
    Vehicle_DELETED = models.BooleanField('Gelöscht',default=False)

class Recall(models.Model):
    Recall_ID = models.AutoField('ID', primary_key= True)
    Recall_CODE = models.CharField('Rückruf-Code',max_length=500, unique= True)

class Vehicle_Recall(models.Model):
    Vehicle_Recall_ID = models.AutoField('ID', primary_key=True)
    Vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
    Recall  = models.ForeignKey(Recall, on_delete=models.CASCADE)

Я хочу сделать оператор Select следующим образом:

SELECT * FROM Vehicle INNER JOIN(Recall INNER JOIN Vehicle_Recall ON Recall.ID = Vehicle_Recall.Recall) ON Vehicle.ID = Vehicle_Recall.Vehicle WHERE Recall.ID=1 AND Vehicle.DELETED)=FALSE;

Есть ли способ сделать такой запрос в django?

1 Ответ

1 голос
/ 03 августа 2020
  1. Вы можете использовать ORM Django следующим образом (это пример):
    vehicles = Vehicle.objects.filter(Vehicle_DELETED=False).filter(
        Q(vehicle_recall__Recall__Recall_ID=1)
    )

, который генерирует следующий запрос SQL:

SQL SELECT "vehicle"."Vehicle_ID", "vehicle"."Vehicle_VIN", "vehicle"."Vehicle_DELETED" FROM "vehicle" INNER JOIN "vehicle_recall" ON ("vehicle"."Vehicle_ID" = "vehicle_recall"."Vehicle_id") WHERE ("vehicle"."Vehicle_DELETED" = False AND "vehicle_recall"."Recall_id" = 1)

Вы можете использовать необработанный запрос следующим образом:
    vehicles = Vehicle.objects.raw(f"""
    SELECT * FROM Vehicle 
    INNER JOIN(Recall INNER JOIN Vehicle_Recall ON Recall.ID = Vehicle_Recall.Recall) 
        ON Vehicle.ID = Vehicle_Recall.Vehicle 
    WHERE Recall.ID=1 AND Vehicle.DELETED=FALSE;
    """)

и не забудьте настроить имена таблиц.

Я предлагаю первое решение, но соответствующий код зависит от потребности. Я приготовил лишь несколько примеров, чтобы показать его простоту.

...