Django: возвращает логическое значение, независимо от того, существует ли значение во ManyToManyField или нет - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть две модели 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, что объект 'o' в ModelB уже имеет какое-то значение для поля 'dogs'.

Например, если существует объект 'o' в ModelB, значение которого для поля 'name' равно 'Ankit', а значение для поля 'dogs' - это ['Labra', 'Rottweiler' и 'Pug'],Я хочу проверить, есть ли у o.dogs «Лабра» или нет.Как я могу достичь этого?Так как поле 'dogs' является полем ManyToMany, поэтому, когда я использую

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

, я получаю следующий результат:

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

Я не понимаю, как поступить дальше.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Поле «многие ко многим» связано с набором запросов, который предоставляет обычный API запросов.Поэтому, если у вас есть объект ModelB o и вы хотите проверить его поле dogs на предмет определенного имени, вы можете сделать:

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

(я не уверен, почему это поле называется "многозначности ", хотя. Есть ли в нем несколько значений? Если да, то почему - функция нескольких элементов уже обеспечивается полем" многие ко многим ".)

Редактировать

Чтобы проверить, что поле содержит значение, используйте фильтр __contains:

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

Но на самом деле, как я уже сказал, вы не должны иметь несколько значений в одном поле;для этого и нужны отношения m2m.

0 голосов
/ 11 декабря 2018
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()
...