在django ORM的使用中,常常會出現選擇的狀況,例如:前端
class person(odels.Model):
sex_type = (('male',u'男'), ('female',u'女')) sex = models.CharField(u"性別", choices=sex_type,max_length=32)
但並非全部的選擇都是隻有一個結果的,例如數據庫
class person(odels.Model):
language_choices= (('chinese',u'漢語'), ('english',u'英語'),('french','法語')) language = models.CharField(u"使用語言", choices=language_choices,max_length=32)
很明顯,假如一我的又會漢語,又會英語,那麼這個choices就不能上線咱們的目的了,那麼久能夠使用MultiSelectField來實現了,例如django
class person(odels.Model):
language_choices= (('chinese',u'漢語'), ('english',u'英語'),('french','法語')) language = MultiSelectField(u"使用語言",choices=language_choices)
須要注意的幾點:ide
1:MultiSelectField不支持list_display,若是在list_display中添加MultiSelectField的項就會出現報錯,因此當你想在admin頁管理你的數據庫資料時,不能在查看頁面查看到MultiSelectField的項的內容。oop
2:當你想使用form直接在前端生成編輯或查看數據庫內容的頁面時,MultiSelectField的項不能直接顯示出來,而是須要進行特殊的處理,其格式以下(其中provider表示query對象,field表示MultiSelectField項)ui
{% for value, text in providers.field.choices %}
<div class="ui slider checkbox">
<input id="id_providers_{{ forloop.counter0 }}" name="{{ form.providers.name }}" type="checkbox" value="{{ value }}"{% if value in checked_providers %} checked="checked"{% endif %}>
<label>{{ text }}</label>
</div> {% endfor %}
3:在使用filter對MultiSelectField項進行查詢時須要注意MultiSelectField項在數據庫內存的是一個列表類型的數據,若是查詢選擇的項和你的查詢條件徹底相同的數據直接使用spa
models.Person.objects.filter(language=['chinese'])
但若是想要filter到全部選擇了其中一個選項的數據(包括只選擇了該選項的數據和同時選擇了該選項和其餘選項的數據),直接使用django提供的查詢方法就不行了,那麼能夠使用Q語句來實現查詢,其形式爲()code
models.persom.objects.filter( Q(language='chinese')|Q(language__startswith='chinese,')|Q(language__endswith=',chinese')|Q(language__contains = ',chinese,')