带有“和”条件的Django多对一相关查询

时间:2018-07-17 06:57:06

标签: django django-models django-queryset django-filter

我具有以下模型结构:

class Drive(models.Model):
 car_name = models.CharField(max_length=3,blank=True, null=True,choices=sp.CAR_NAMES ,help_text="The name of the car")
class DataEntity(models.Model):
 parent_drive = models.ForeignKey(Drive,models.CASCADE)
 type = models.IntegerField(blank=True, null=True,choices=sp.DATA_ENTITY_TYPES, help_text="The Type of the data")

我正在尝试获取所有具有DataEntity.type = 3 DataEntity.type = 4

的驱动器。

我尝试使用以下内容:

query_set = Q{(AND: ('dataentity__type', 3), ('dataentity__type', 4))}
Drive.objects.filter(query_set).distinct()

但是我有空名单... 我看了一下sql语句:

SELECT ••• FROM `drive` INNER JOIN `data_entity` ON (`drive`.`id` = `data_entity`.`parent_drive_id`) WHERE (`data_entity`.`type` = 3 AND `data_entity`.`type` = 4)) subquery

Django系统将条件放在WHERE语句中,这会导致问题(没有包含这两种类型的数据DataEntity)

如何合理地查询集,以获取包含DataEntity.type = 3 DataEntity.type = 4的驱动器?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以尝试执行以下操作:

Drive.objects.filter(dataentity__type__in=[3, 4]).distinct()

答案 1 :(得分:0)

我找到了解决方案。 当您使用Q(dataentity__type=3)&Q(dataentity__type=4)时,ORM系统将AND表达式放在“位置”部分:

SELECT ••• FROM drive` INNER JOIN data_entity ON (drive.id = data_entity.parent_drive_id) WHERE (data_entity.type = 3 AND data_entity.type = 4)) 

由于没有两个类型的数据实体,我得到了0个结果。

但是当我使用Drive.objects.filter(Q(dataentity__type=3))&filter(Q(dataentity__type=4)).distinct()时 我得到的驱动器具有类型3的数据实体,也具有类型4的数据实体 SQL查询:

SELECT ••• FROM `drive` INNER JOIN `data_entity` ON (`drive`.`id` = `data_entity`.`parent_drive_id`) LEFT OUTER JOIN `data_entity` T3 ON (`drive`.`id` = T3.`parent_drive_id`) WHERE (`data_entity`.`type` = 3 AND T3.`type` = 4)