我具有以下模型结构:
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的驱动器?
谢谢
答案 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)