使用查询获取View.py中的MultiSelectField选定项

时间:2019-05-05 13:45:29

标签: python django django-models django-views multi-select

我正在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 :(得分:0)

这不是一个坏方法。如果您协助使用多选字段,则从本质上讲,这是配置您要执行的操作的最佳方法。否则,我建议在这种类型的实例中使用manytomany字段。允许更轻松的引用。 (仅供参考:Multiselect只是将('25','genre')保存为逗号分隔的字符串。这就是在这种情况下您的方法最好的原因)