使用django-select2在下拉菜单中显示不同的值

时间:2019-11-18 10:48:30

标签: django jquery-select2 django-select2

我正在使用django-select2和用于通过ModelSelect2Widget创建下拉列表的表单。

我的问题是我在字段“名称”上进行了过滤,并且多个对象可以具有相同的“名称”但具有不同的“值”(请参见下面的模型描述)。导致同一名称在下拉菜单中多次出现。

我想删除这些重复项。我尝试使用.distinct('name')来选择查询集,但它似乎不起作用。 example of result obtained with ModelSelect2Widget

以下是我使用的代码的说明:

我有两个通过外键链接的模型

models.py

class Who(models.Model):
    name = models.CharField(max_length=256)
    value = models.CharField(max_length=256)

    def __str__(self);
        return str(self.name)

class Data(models.Model):
    who = models.ForeignKey(Who)

我使用这里描述的形式:

forms.py

from django_select2.forms import ModelSelect2Widget
...

class CreateDataForm(ModelForm):
    class Meta:
        model = Data
        fields = ('who',)
        widgets = {'who': ModelSelect2Widget(
            queryset=Who.objects.all().distinct('name'),
            search_fields=['name_icontains']
        )}

有人知道我如何删除这些重复项吗?

2 个答案:

答案 0 :(得分:1)

我终于找到了问题的根源。

在django_select2 ModelSelect2Mixin中,用于过滤要显示在下拉菜单上的值的函数filter_queryset以“ return queryset.filter(select).distinct()”结束。这个问题是该.distinct()在查询集(.distinct(“ name”))中占主导地位

为了解决我的问题,我不得不重写过滤器queryset函数,并删除.distinct():

cnx1 = cnxpool.get_connection()
cnx2 = cnxpool.get_connection()

答案 1 :(得分:0)

# You can define queryset like this

class CreateDataForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['who'].queryset = Who.objects.distinct()

    class Meta:
        model = Data
        fields = ('who',)