如何查询以便显示模型的字段而不是实际模型

Posted

技术标签:

【中文标题】如何查询以便显示模型的字段而不是实际模型【英文标题】:How to query so that a field of a model will show up instead of the actual model 【发布时间】:2021-10-18 06:22:40 【问题描述】:

我正在尝试查询,以便每个模型实例中的字段值都不会重复显示。所有这些都发生在表单中:

class OrganisorClassStatusUpdateForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(OrganisorClassStatusUpdateForm, self).__init__(*args, **kwargs)
        self.fields['off_day_student'] = forms.ModelChoiceField(
            queryset= Class.objects.filter(teacher=self.instance.teacher).filter(is_new_set=True).filter(time=self.instance.time).order_by('-date')[:10]
        )

这里,self.instance 指的是我正在使用此表单更新的Class 模型实例。但是,使用此代码,我将收到一个表单字段的Class 实例列表。我想要的是一个Student 列表,对应于表单字段中的每个Class 实例(每个班级只有一个学生)。因此,我想要 Student1、Student2、Student3 而不是 Class1、Class2、Class3。此外,如果学生姓名有任何重复,我只想显示一个。我希望学生也按-date的顺序列出上面代码所示的课程。请问我任何问题。非常感谢。

这是你们中的一些人所问的类模型:

class Class(models.Model):
    teacher = models.ForeignKey('Agent', null=True, blank=True, on_delete=models.SET_NULL)
    student = models.ForeignKey('Lead', null=True, blank=True, on_delete=models.SET_NULL, related_name='student')

【问题讨论】:

【参考方案1】:

在这种情况下,尝试从Lead/Student 生成查询集,并使用您现有的Class 过滤器对抗related_name

queryset = Lead.objects.filter(
    student__in=Class.objects.filter(
        teacher=self.instance.teacher,
        is_new_set=True,
        time=self.instance.time,
    )[:10]
).order_by('-student__date')

如果您使用的是 Postgres,您可以使用所需的字段名称调用 distinct,例如:.distinct('name')

【讨论】:

感谢您的评论。这似乎有效,但是当我添加 .distinct('name') 时出现错误,显示为 Cannot resolve keyword 'name' into field.。当我只写distinct() 时,错误消失了,但我的表单列表中有多个同一个学生。我有什么办法可以解决这个问题?其他一切似乎都很好,例如根据课程日期对学生进行排序。 你在使用 postgres 吗? Lead 模型中的字段名称是什么?多个学生的问题是由于order_bydistinct 所描述的here。因此,您可以尝试删除order_by 并使用distinct 并查看它是否删除了重复项,注意排序将消失。 我正在尝试解决这个问题。如果稍后我通过评论部分与您联系,我希望您不会介意。到目前为止,您的代码帮助很大。

以上是关于如何查询以便显示模型的字段而不是实际模型的主要内容,如果未能解决你的问题,请参考以下文章

graphene-django:查询所有模型字段而不是请求的字段

如何创建一个从其他模型中总结的模型,而不是保存到数据库中而是显示在管理页面中?

如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id

将 django 表单中的布尔模型字段显示为单选按钮而不是默认复选框

具有动态模型的 Dapper ORM - 如何不返回字段而不是“字段”= NULL?

使用模型表单集时如何呈现文本框而不是选择框