我正在使用django-select2和表单来创建一个下拉列表,使用ModelSelect2Widget。
我的问题是,我过滤了字段'name‘,几个对象可以有相同的'name’但不同的'value‘(参见下面的模型描述)。这会导致同一名称在下拉菜单中出现多次。
我想删除这些副本。我尝试使用.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']
)}有没有人知道我怎么删除这些重复的东西?
发布于 2019-11-18 21:55:39
我终于找到了问题的根源。
在django_select2 ModelSelect2Mixin中,用于过滤要在下拉菜单上显示的值的函数filter_queryset以"return queryset.filter(select).distinct()“结束。这个问题是这个名称(.distinct(“.distinct”))优先于来自查询集的名称()
为了解决我的问题,我必须覆盖filter queryset函数,并删除.distinct():
class ModelSelect2WidgetWithoutDistinct(ModelSelect2Widget):
"""In dropdown list, shows objects from queryset without the initial .distinct()."""
def filter_queryset(self, request, term, queryset=None, **dependent_fields):
"""Same function as in select2 ModelSelect2Mixin except last line."""
if queryset is None:
queryset = self.get_queryset()
search_fields = self.get_search_fields()
select = Q()
term = term.replace('\t', ' ')
term = term.replace('\n', ' ')
for t in [t for t in term.split(' ') if not t == '']:
select &= reduce(lambda x, y: x | Q(**{y: t}), search_fields,
Q(**{search_fields[0]: t}))
if dependent_fields:
select &= Q(**dependent_fields)
return queryset.filter(select) # initially queryset.filter(select).distinct()发布于 2019-11-18 19:00:41
# 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',)https://stackoverflow.com/questions/58912835
复制相似问题