Django Отфильтруйте много ко многим полям JSON модели с данным - PullRequest
0 голосов
/ 20 января 2020

У меня есть модель «Фильмы и участники», и она выглядит следующим образом:

class Movie(models.Model):
    something something
    participants = models.ManyToManyField(Participant)

class Participant(models.Model):
    something something 
    type = models.CharField(max_length=127, null=True, blank=True)

Я хотел бы проверить поле Участники тип с указанным списком и в соответствии с в нем перечислены фильмы или нет.

Например, у меня есть type_list=["Adults", "Children", "Senior"], но у объекта Mov ie есть 2 объекта-участника, один из которых - type="Adults", а другой - type="Children"

В примере я не ожидал бы показать эти фильмы, поскольку в нем нет всех необходимых типов участников.

Что я пробовал до сих пор;

  • movie.participants.filter(type__in=["Adults", "Children", "Senior"])

однако, это возвращает объект с двумя участниками

  • movie.participants.filter(Q(type="Adults") | Q(type="Children") | Q(type="Senior")):

этот также возвращает объект с двумя участниками.

Я также не могу использовать оператор &.

Единственная идея, с которой я остался, - это проверить количество участников. Query вернул два, но у меня есть три участника, поэтому я не могу показать этот mov ie, но проблема в том, что в этом списке есть переменная, исходящая из внешнего интерфейса. Таким образом, мой запрос и оператор if должны быть обобщенными c, и я не знаю, как это сделать, и я также на 100% уверен, что должна быть лучшая практика, а не эта.

Я был бы признателен каждая крошечная помощь, спасибо!

1 Ответ

1 голос
/ 20 января 2020

Вы можете выбрать все типы участников, используя values_list с distinct и сравнить возвращаемое значение с предоставленным списком типов, повторяя предоставленный список:

types_from_db = movie.participants.values_list("type", flat=True).distinct()

for movie_type in ["Adults", "Children", "Senior"]:
     if movie_type not in types_from_db:
         return False
return True 
...