Получение MultiSelectField выбранных элементов в views.py с запросом - PullRequest
0 голосов
/ 05 мая 2019

Я пишу метод в views.py, который должен возвращать список объектов Artist по стране и жанру.

У меня есть этот код в models.py:

GENRES = ((1, 'Alternative'),
          (2, 'Blues'),
          (3, 'Classical'),
          (4, 'Country'),
          (5, 'Disco'),
          (6, 'Drum and Bass'),
          (7, 'Dubstep'),
          (8, 'EDM'),
          (9, 'Electronic'),
          (10, 'Experimental'),
          (11, 'Folk'),
          (12, 'Funk'),
          (13, 'Garage'),
          (14, 'Grime'),
          (15, 'Hardstyle'),
          (16, 'Heavy Metal'),
          (17, 'Hip Hop'),
          (18, 'House'),
          (19, 'Indie'),
          (20, 'Jazz'),
          (21, 'Multi-Genre'),
          (22, 'Pop'),
          (23, 'Punk'),
          (24, 'R&B'),
          (25, 'Reggae'),
          (26, 'Rock'),
          (27, 'Ska'),
          (28, 'Soul'),
          (29, 'Techno'),
          (30, 'Trance'),
          (31, 'Urban'),
          (32, 'World'))

genres = MultiSelectField(choices=GENRES, null=True)
country = CountryField(default="Poland")

В настоящее время я перебираю все объекты и ищу те, которые мне нужны, используя python:

countries_selection = request.POST.get('countriesSelection')
genres_selection = request.POST.get('genresSelection')

results = []

artists = Artist.objects.all()
for artist in artists:
    if artist.country.name == countries_selection:
        if artist.genres:
            for genre in artist.genres.__str__().split(","):
                if genres_selection in genre:
                    results.append(artist)
        else:
            results.append(artist)

Очевидно, что это не очень хороший подход. Я хочу получить те же результаты, используя запрос. Я попробовал:

Artist.objects.filter(genres__contains = 'Rock')

Но он ничего не возвращает, потому что в базе данных сохраняются только ключи, а не значения. Например, этот запрос работает, но у меня не будет ключа в моей функции views.py:

Artist.objects.filter(genres__contains = '26')

1 Ответ

0 голосов
/ 05 мая 2019

Это не плохой подход; По сути, это лучший способ настроить то, что вы пытаетесь сделать, если вы помогаете использовать поле с несколькими вариантами выбора. В противном случае я бы предложил использовать множество полей в этом типе экземпляра. Позволяет намного проще ссылаться. (К сведению: Multiselect просто сохраняет ('25', 'жанр') в виде строки, разделенной запятыми. Вот почему ваш метод является лучшим в этом случае)

...