Я пишу метод в 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')