python - 在 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_weeks
andmax_weeks
字段组成的字符串。
然而,这样做的结果是过滤不完全对应于用户所看到的。考虑这个例子:
在这里,标题为“产后登记:0 周”的列表中的第一个条目是自动生成的“标题”。因此,如果我在搜索栏中搜索“Postpartum”并按 Enter,我只会得到一个结果:
而我希望有两个结果。(顺便说一句,还有一个OrderingMixin
按标题的字母顺序对结果进行排序,出于同样的原因,这也不起作用)。
为了解决这个问题,我想在查询集中添加一个字段'str'
,其中包含对象的字符串表示。
在我如何从 django 的 queryset 中获取字符串表示中的评论之后,我查看了annotate
,但我无法准确找到我正在寻找的内容。我想要类似的东西
queryset = queryset.annotate(str=str(object))
这样之后我就可以添加Q(str__icontains=query)
到过滤器中。但是,我不确定这是否可行,因为聚合函数之类Count()
的一般数据库函数并不真正“了解”Python 的模型字符串表示形式。
如何通过实际的字符串表示来过滤结果?(我最好通过注释来做到这一点,queryset
因为这也适用于OrderingMixin
)。
解决方案
推荐阅读
- batch-file - 可以从文本文件中读取特定行/字母的批处理代码
- c++ - 结构的共享指针以在所有文件中使用处理程序的实例
- java - 在 Java 中导入新框架?
- date - Redshift 存储过程未正确传递日期
- python - 如何删除 nlargest 元素?
- java - 注册错误:java.lang.string 类型的值 br 无法转换为 jsonobject
- flask - Gunicorn --preload 选项导致工人挂起?
- sql - 在 SQL 中设置一个变量,并使用该变量来计算需要多少个框才能适合给定尺寸的项目列表
- javascript - 如何使一个div的margin-left等于另一个div的margin-left
- jquery - 如何从自动完成建议中接收关键字,而不在 jQuery UI 的末尾添加逗号?