在forms.py中对queryset使用Django Distinct
我想在forms.py里获取一个不重复的列表,像这样:
forms.ModelMultipleChoiceField(queryset=Events.objects.values('hostname'), required=False).distinct()
在Python的命令行里,这个命令运行得很好,但在forms.py里用的时候,表单却是空的,什么都不显示。当我用Events.objects.all()时,表单能正常显示,但用distinct就不能和Events.objects.all()一起工作……我也试过values_list等方法,但这些似乎也不适合用在表单里……有没有人知道怎么在ModelMultipleChoiceField里实现SELECT DISTINCT?
我在stackoverflow上看过其他相关问题,但都没有解决我的问题,希望有人能告诉我怎么在forms.py里做到这一点。
谢谢大家!
1 个回答
0
对于ModelMultipleChoiceField,Django期望你提供一个模型对象,因为它会存储所选项的主键值。换句话说,它是用来管理多对多关系的字段。
听起来你是想存储实际的字符串值,所以这可能不是适合你的选择。你可能想用标准的MultipleChoiceField,并重写表单的__init__
方法来设置字段的choices
属性。不过要记住,任何选择字段都是一组包含两个元素的元组,每个元组里有数据库的值和显示的值——所以即使你希望它们是一样的,你也需要把值写两遍:
def __init__(self, *args, **kwargs):
super(MyFormClass, self).__init__(*args, **kwargs)
self.fields['mychoicefield'].choices = [(x[0], x[0]) for x in
Event.objects.values_list('hostname').distinct()])