【发布时间】:2018-07-17 14:47:49
【问题描述】:
在我的模型中,一个 __str__(self) 从创建响应时的 DateTimeField 中派生出季度和年份。 p>
Models.py
class Response(models.Model):
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
msg = u"Q%d %d" %(((self.created.month-1)//3)+1, self.created.year)
return msg
在 Admin 中,我希望能够根据提交记录的季度过滤记录(实际上,我想根据谁没有为特定季度提交响应进行过滤,我想我以后可以用一个放置得当的波浪号来实现),所以我有以下几点:
Admin.py
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'latest_response')
list_filter = ('response__created', 'response')
def latest_response(self, obj):
return obj.response_set.latest('created')
到目前为止,我在测试中已经提交了四个响应(通过 def __str__ 我有 2 个“Q1 2018”,和 2 个“-”),结果如下所示: p>
知道为什么我会得到 3 个“2018 年第一季度”和 1 个“-”吗?我只想要过滤器列表中的 1 个“Q1 2018”
额外问题 - 知道如何限制 filter_list 中列出的项目数量(通过响应)?我想将它们限制为最新的 4 个,因为我使用的是字符串,这可能会有问题。
编辑
刚刚在控制台日志中注意到过滤器正在使用基于响应 ID 的 GET 请求:
"GET /admin/auth/user/?response__id__exact=1 HTTP/1.1" 200 14277
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__id__exact=2 HTTP/1.1" 200 14277
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__id__exact=3 HTTP/1.1" 200 14270
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__isnull=True HTTP/1.1" 200 14599
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
因此,据我了解,by response 过滤器正在显示四个对象的通用名称(2018 年第一季度)(以它们的 ID 区分)。
如何根据对象的通用名称/自身过滤对象?我猜是通过另一个 def 到 Response 类?
【问题讨论】:
-
你试过不同的吗?
-
我认为这不会改变它,但我会试一试。查看更新的问题 - 我在控制台中注意到过滤时生成的请求与响应 id 相关联(它们每个都是不同的)。
-
通常我将 str 保留为我班级的特定标识....您可以为您的季度创建另一个 def Quarter(self),并对其进行过滤
-
@Walucas 我正要尝试 - 有道理。将其添加为答案,稍后我会检查结果。