web-dev-qa-db-ja.com

オブジェクトがmanytomanyに存在するかどうかを確認する方法

モデル

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)

ビールとサラの関係があるのか​​、どうやって作るのか知りたい?

18
Henry Ramos

Salasの名前は一意ではないため、このソリューションでは問題が発生する可能性があります。したがって、1つだけのサラを見つけることを期待して、サラの名前でフィルタリングした場合、それは起こらない可能性があります。

私はあなたに行うことをお勧めします:

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

こうすることで、beer.salas_set.all()は、特定のオブジェクトが「in」キーワードでそこにあるかどうかを確認できるQuerySetを返します。

15
Patrick Bassut

使用することをお勧めします:

_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()はデータベースから0行または1行のみを選択し、(ループせずに)結果をすぐに返します。

47