【问题标题】:Django: Returning boolean whether a value exist in ManyToManyField or notDjango:返回布尔值是否存在于ManyToManyField中
【发布时间】:2018-12-11 13:51:40
【问题描述】:

我有两个模型 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' 具有某些值。

例如,如果 ModelB 的对象 'o' 的字段 'name' 的值为 'Ankit' 并且字段 'dogs' 的值为 ['Labra' , 'Rottweiler' 和 'Pug']。我想检查 o.dogs 是否有“Labra”。我怎样才能做到这一点?由于 'dogs' 字段是 ManyToMany 字段,所以当我使用时

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

我得到的是以下结果:

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

我不知道如何从这里着手。

【问题讨论】:

    标签: django django-models django-views manytomanyfield


    【解决方案1】:
    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()
    

    【讨论】:

    • 您在哪里通过查询特定对象的“Labra”是否存在于该对象的 field2 值中?
    • 我认为您检查的是狗列表而不是单只狗。
    • @AshokKumar 请查看我的更新答案。如果存在查询,我添加了寻找单只狗的案例。
    • 先生,我很感谢您花时间来帮助我,但对于那些存在的价值观,我得到了 False。
    【解决方案2】:

    一个多对多字段与一个查询集相关联,它公开了普通的查询 API。因此,如果您有一个 ModelB 对象 o 并且您想检查它的 dogs 字段以获取特定名称,您可以这样做:

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

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

    编辑

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

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

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

    【讨论】:

    • 如果我想知道 ModelB 的任何对象是否在 field2 中包含 'Labra' 怎么办?在这种情况下,我想检查 ModelB 的每个对象是否在其字段 2 中包含“Labra”。感谢@DanielRoseman 的回复。
    • 我已经更改了@DanielRoseman 先生的字段名称,并且我确实执行了makemigrations 并在实际代码中进行了迁移。我请求您更改字段名称,以免其他人感到困惑。虽然这完全是我的错。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多