我正在使用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']
)}
有人知道我如何删除这些重复项吗?
答案 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',)