首页 > 解决方案 > 在 Django 中,如何用字符串表示每个对象来注释查询集?

问题描述

我正在研究一个继承自 DjangoListView并通过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。这定义如下:

class CheckInType(TimeStampedModel, TimingMixIn):
    title = models.CharField(blank=True, max_length=255)
    description = models.TextField(blank=True)

    # Timing
    is_prenatal = models.BooleanField(default=False)
    min_weeks = models.IntegerField(default=0)
    max_weeks = models.IntegerField(default=0)

    def __str__(self):
        if self.title:
            return self.title
        else:
            prenatal = 'Prenatal' if self.is_prenatal else 'Postpartum'
            return f'{prenatal} Check-In: {self.timing}' 

为简洁起见,我将省略详细信息TimingMixin,但self.timing基本上是"0-4 weeks"min_weeksandmax_weeks字段组成的字符串。

然而,这样做的结果是过滤不完全对应于用户所看到的。考虑这个例子:

在此处输入图像描述

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

在此处输入图像描述

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

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

我如何从 django 的 queryset 中获取字符串表示中的评论之后,我查看了annotate,但我无法准确找到我正在寻找的内容。我想要类似的东西

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

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

如何通过实际的字符串表示来过滤结果?(我最好通过注释来做到这一点,queryset因为这也适用于OrderingMixin)。

标签: pythondjango

解决方案


推荐阅读