Django 通过 MultiSelectField 值过滤 QueryString?

Lor*_*ABA 1 python django django-queryset

我正在使用MultiSelectField来存储话题/话题的对话

我的模型看起来有点像这样:

class Conversation(models.Model):
    (...)
    note= models.CharField(max_lenght=250)
    TOPIC_CHOICES =(
        (1,"about cats"),
        (2, "about dogs"),
        (3, "about fluffy little things"),
    )
    topic =MultiSelectField(choices=TOPIC_CHOICES)
Run Code Online (Sandbox Code Playgroud)

我在里面使用ListView和过滤 GET 参数get_queryset

表格摘录:

class SearchForm(Form):
    (...)
    topic = MultipleChoiceField(choices=Conversation.TOPIC_CHOICES, required=False)
Run Code Online (Sandbox Code Playgroud)

get_queryset 提取:

(...)
if form.cleaned_data['topic']:
                search_params.update({'topic__in': form.cleaned_data['topic']})
(...)
return qs.filter(**search_params)
Run Code Online (Sandbox Code Playgroud)

这种方法适用于单值选择字段。

但在这种情况下,如果我是前任。以“关于猫”的形式选择我只得到了主题设置为猫的对象(“关于猫”而没有其他 - 单个值)。

我想要的是其中一个主题值为 1-“关于猫”的所有对象。这意味着如果某个对象有 topic= 1,3(cats and fluffy things) 它也应该出现

第二种情况:我在表单中选择“关于猫”和“关于狗” - 我希望所有将猫作为主题之一的对象以及将狗作为主题之一的所有对象现在,当我选择多个选项时例如。猫和狗 我把所有只有猫的和所有只有狗的作为主题

是否有任何其他字段查找字符串而不是__in可以实现这一目标?如果不是,那么最轻松的方法是什么?

Jen*_*rom 5

为此使用 Django Q 集如何,因此您的过滤器将如下所示:

...objects.filter( Q(topic__exact = cat) | Q(topic__startswith = '%s,' % cat) | Q(topic__endswith = ',%s' % cat) | Q(topic__contains = ',%s,' % cat),
other_attributes = 'xxx',
Run Code Online (Sandbox Code Playgroud)