我正在尝试构建一个MultipleChoiceFilter
选项是相关模型上存在的一组可能日期(DatedResource
)。
到目前为止,这是我正在使用的...
resource_date = filters.MultipleChoiceFilter(
field_name='dated_resource__date',
choices=[
(d, d.strftime('%Y-%m-%d')) for d in
sorted(resource_models.DatedResource.objects.all().values_list('date', flat=True).distinct())
],
label="Resource Date"
)
当它显示在 html 视图中时...
起初这很好用,但是如果我创建DatedResource
具有新的不同值的新对象,date
我需要重新启动我的网络服务器,以便在此过滤器中将它们作为有效选择。我相信这是因为该choices
列表在网络服务器启动时被评估一次,而不是每次我的页面加载时。
有没有办法解决这个问题?也许通过一些创造性的使用 a ModelMultipleChoiceFilter
?
谢谢!
编辑:
我尝试了一些简单的ModelMultipleChoice
用法,但遇到了一些问题。
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
queryset=resource_models.DatedResource.objects.all().values_list('date', flat=True).order_by('date').distinct(),
label="Resource Date"
)
HTML 表单显示得很好,但是选择不是过滤器接受的值。我得到"2019-04-03" is not a valid value.
验证错误,我假设是因为这个过滤器需要datetime.date
对象。我考虑过使用该coerce
参数,但是ModelMultipleChoice
过滤器不接受这些参数。
根据 dirkgroten 的评论,我尝试使用链接问题中的建议。这最终会像
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
to_field_name='date',
queryset=resource_models.DatedResource.objects.all(),
label="Resource Date"
)
这也不是我想要的,因为现在的 HTML 表单现在是 a) 显示str
每个的表示DatedResource
,而不是DatedResource.date
字段和 b) 它们不是唯一的(例如,如果我有两个DatedResource
相同的对象date
,它们的str
表示都出现在列表。这也是不可持续的,因为我有 200k+ DatedResources
,并且在尝试将它们全部加载时页面挂起(与values_list
过滤器相比,它能够在几秒钟内拉出所有不同的日期。