Django:返回布尔值,ManyToManyField中是否存在值

时间:2018-12-11 13:51:40

标签: django django-models django-views manytomanyfield

我有两个模型ModelA和ModelB。

class ModelA(models.Model):
    field1 = models.CharField(max_length=100)
    def __str__(self):
        return self.field1

Class ModelB(models.Model):
    name = models.CharField(max_length=100)
    dogs  = models.ManyToManyField(ModelA)

我想在django视图中检查ModelB的对象“ o”是否已经对“ dogs”字段具有某些值。

例如,如果模型B的对象“ o”的字段“名称”的值为“ Ankit”,字段“ dogs”的值为['Labra','Rottweiler'和'Pug']。我想检查o.dogs是否具有“ Labra”。我怎样才能做到这一点?由于“ dogs”字段是ManyToMany字段,因此当我使用

ModelB.objects.all().values('dogs')

我得到的是以下结果:

<QuerySet [{'dogs': 1}, {'dogs': 2}, {'dogs': 3}]> 

我不从这里开始。

2 个答案:

答案 0 :(得分:0)

dogs_list = ['Labra' , 'Rottweiler', 'Pug']
ModelB.objects.filter(dogs__multivalues__in=dogs_list).exists()

如果存在则返回True,如果不存在则返回False。 如果要检查特定的狗,可以执行以下操作:

dog_name = 'Labra'
ModelB.objects.filter(dogs__multivalues=dog_name).exists()

答案 1 :(得分:0)

多对多字段与查询集相关联,该查询集公开了普通的查询API。因此,如果您有一个ModelB对象o,并且想要检查其dogs字段中的特定名称,则可以执行以下操作:

o.dogs.filter(multivalues='Labra')

(不过,我不确定为什么将该字段称为“多值”。它中是否包含多个值?如果是这样,为什么-多对多字段已经提供了多元素功能。)

修改

要检查字段是否包含值,请使用__contains过滤器:

o.dogs.filter(multivalues__contains='Labra')

但是,正如我所说的,实际上,您不应该在一个字段中包含多个值;这就是m2m关系的目的。