在Django中,如何用字符串表示每个对象来注释queryset?

2024-06-16 12:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个视图,它继承了Django的ListView,并通过SearchMixin使用搜索表单。以下是(简化)视图:

class ListBase(DashboardAccessMixin, SearchMixin):
    queryset = CheckInType.objects.all()

    def get_queryset(self):
        queryset = super().get_queryset()
        query = self.search_data('q')

        if query:
            queryset = queryset.filter(
                Q(title__icontains=query) | Q(description__icontains=query))

        return queryset


class CheckInTypeList(ListBase, ListView):
    template_name = 'check_in_types/index.html'

然而,模板实际上并没有显示{{ object.title }},而只显示了{{ object }},它对应于CheckInType的字符串表示。定义如下:

^{pr2}$

为了简洁起见,我将省略TimingMixin的细节,但是self.timing基本上是一个类似于min_weeksmax_weeks字段组成的字符串。在

然而,这样做的结果是,过滤并不完全符合用户看到的内容。考虑这个例子:

enter image description here

在这里,名为“产后检查:0周”的列表中的第一个条目是自动生成的“标题”。因此,如果我在搜索栏中搜索“产后”,然后按Enter键,我只得到一个结果:

enter image description here

但是我希望有两个结果。(顺便说一句,还有一个OrderingMixin按标题的字母顺序对结果进行排序,这也是因为同一个原因而不起作用)。在

为了解决这个问题,我想在包含对象字符串表示的queryset中添加一个字段'str'。在

How can i get the string representation from queryset in django中的评论之后,我查看了^{},但是我没有找到我想要的东西。我想要点像

queryset = queryset.annotate(str=str(object))

这样我就可以在过滤器中添加Q(str__icontains=query)。但是,我不确定这是否可行,因为像Count()这样的聚合函数是一般的数据库函数,它们并不真正“了解”Python模型的字符串表示。在

如何通过实际的字符串表示来过滤结果?(我希望通过注释queryset来实现这一点,因为这也适用于{})。在


Tags: 字符串self视图getobjecttitlequeryclass