Django选择三个具有筛选条件的模型



我有三种型号:

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 * 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. 您可以使用Django的ORM,如下所示(这是一个示例(:
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)

  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;
""")

记住要调整表名。

我提出了第一种解决方案,但适当的代码取决于需要。我只准备了一些例子来说明它的简单性。

最新更新