【问题标题】:Django Distinct on queryset in forms.pyDjango Distinct 在 forms.py 中的查询集上
【发布时间】:2010-03-30 08:11:35
【问题描述】:

我尝试在 forms.py 中获取一个不同的列表,如下所示:

forms.ModelMultipleChoiceField(queryset=Events.objects.values('hostname'), required=False).distinct()

在 python shell 中,这个命令完美运行,但是在 forms.py 中尝试它时,我留下了一个空白表单,所以什么都没有出现。当我只执行 Events.objects.all() 时,表单会出现,但 distinct 不适用于 Events.objects.all() ......我也尝试了 values_list 等,但似乎也不适合表单。 . 有人知道如何将 SELECT DISTINCT 放入 ModelMultipleChoiceField 中吗?

我在 stackoverflow 上阅读了一些关于此的其他问题,但我似乎没有任何解决办法,所以希望有人知道如何在 forms.py 中执行此操作。

提前致谢

【问题讨论】:

    标签: python django forms distinct


    【解决方案1】:

    对于 ModelMultipleChoiceField,Django 需要一个模型对象——因为它存储了所选项目的主键的值。换句话说,它是用来管理多对多字段的。

    听起来您想要存储实际的字符串值,因此这可能不是您的正确选择。您可能想要使用标准的 MultipleChoiceField,并覆盖表单的 __init__ 方法来设置字段的 choices 属性。请记住,尽管任何选择字段都是一组 2 元组,每个元组都包含 db 值和显示值 - 所以即使您希望它们相同,您也需要包含该值两次:

    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()])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2019-06-08
      相关资源
      最近更新 更多