如何验证对象是否存在于manymanmany中

时间:2014-05-02 17:35:49

标签: django many-to-many

模型

class Beer(models.Model):
    pass

class Salas(models.Model):
    name =  models.CharField(max_length=20)
    beers =     models.ManyToManyField('Beer', blank=True)

视图

beer = Beer.objects.get(user=user)
id_sala = request.GET['id_sala']
sala = get_object_or_404(Salas, id=id_sala)


if beer.salas_set.filter(nombre=sala):
# if beer.objects.filter(sitios__id=beer).exists():
    sala.beers.remove(beer)

else:
    sala.beers.add(beer)

我想知道啤酒与sala之间是否存在关系,如何制作这个?

2 个答案:

答案 0 :(得分:28)

我建议你使用:

if beer.salas_set.filter(pk=sala.pk).exists():
    # do stuff

如果您使用sala in beer.salas_set.all(),它会从关系表中选择所有记录并循环遍历它们,以查找给定对象是否存在。但是,beer.salas_set.filter(pk=sala.pk).exists()仅从数据库中选择零行或一行,并立即给出结果(不循环)。

答案 1 :(得分:9)

使用您的解决方案可能会出现问题,因为salas的名称并不是唯一的。所以,如果你按照sala的名称过滤,希望找到一个只有一个sala,那可能不会发生。

我建议你这样做:

if sala in beer.salas_set.all():
    #do stuff:
else:
    # do other stuff

这样,beer.salas_set.all()将返回一个QuerySet,您可以使用'in'关键字检查特定对象是否存在。