在admin上一个模型的修改列表页面中,我在search_fields中添加了一个DateTimeField“birth”。
class DataLog(models.Model):
id = models.AutoField(primary_key=True, verbose_name="idd")
birth = models.DateTimeField(auto_now_add=True, verbose_name="create_time")
class DataLogAdmin(admin.ModelAdmin):
search_fields = ['id', 'birth', ]
我加的时候效果很好,但是今天出现了一个错误:
Warning at /admin/data/log/
Incorrect datetime value: '%2011-07-12%' for column 'birth' at row 1
Django Version: 1.2.3
Exception Location: /usr/lib/python2.5/warnings.py in warn_explicit, line 102
这是数据库sql:
u'SELECT COUNT(*) FROM `data_log` WHERE (`data_log`.`id` LIKE %2011-07-12% OR `data_log`.`birth` LIKE %2011-07-12% )'
从那以后我编辑了很多我的django的项目。
所以我不知道是什么原因
我问题是:
- 在django支持的search_fields中插入一个日期时间字段?
- 正确的做法是什么?
- 知道我的错误吗?
新进展:
我测试了那个sql。
在Mysql中,它运行得很好。(包括mysql的命令行和Django的dbshell)
mysql> SELECT COUNT(*) FROM `data_log` WHERE (`data_log`.`id` LIKE '%07-19%' OR `data_log`.`birth` LIKE '%07-19%' );
+----------+
| COUNT(*) |
+----------+
| 3 |
+----------+
1 row in set, 1 warning (0.00 sec)
但是在django shell中,同样的错误:
User.objects.raw("SELECT COUNT(*) FROM `data_log` WHERE (`data_log`.`id` LIKE '%%07-19%%' OR `data_log`.`birth` LIKE '%%07-19%%' )")[0]
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line 1379, in __getitem__
return list(self)[k]
File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line 1372, in __iter__
for row in self.query:
File "/usr/lib/python2.5/site-packages/django/db/models/sql/query.py", line 73, in __iter__
self._execute_query()
File "/usr/lib/python2.5/site-packages/django/db/models/sql/query.py", line 87, in _execute_query
self.cursor.execute(self.sql, self.params)
File "/usr/lib/python2.5/site-packages/django/db/backends/util.py", line 15, in execute
return self.cursor.execute(sql, params)
File "/usr/lib/python2.5/site-packages/django/db/backends/mysql/base.py", line 86, in execute
return self.cursor.execute(query, args)
File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 168, in execute
if not self._defer_warnings: self._warning_check()
File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 82, in _warning_check
warn(w[-1], self.Warning, 3)
File "/usr/lib/python2.5/warnings.py", line 62, in warn
globals)
File "/usr/lib/python2.5/warnings.py", line 102, in warn_explicit
raise message
Warning: Incorrect datetime value: '%07-19%' for column 'birth' at row 1
4条答案
按热度按时间0qx6xfy61#
好吧...我自己找到答案了。
所以对该模型的所有搜索都失败。
我将在search_fields中保留该DateTimeField,但仅在非Debug服务器中使用。
对于我最初的问题,答案是:
xriantvc2#
根据:
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields
搜索字段必须是某种类型的文本字段,如字符字段或文本字段。2你可以用外键等进行相关的查找,但不能用其他字段类型。
从Django 1.6开始,你可以自定义管理搜索的get_search_results()。因此,我在定义管理类时去掉了search_fields中的date字段,而加入了以下内容:
当然,这只会按年份返回结果,但如果你愿意,你绝对可以做得更好。这不是一个理想的解决方案,真的,但一旦你开始思考,按日期搜索是一个相当不直观的过程。
mum43rcc3#
1.日期或日期时间字段不是字符串类型
1.admin.search_fields仅支持字符串类型的字段或相关字段
1.但我们仍然可以通过覆盖
get_search_results
来搜索日期1.参见django文档
hsvhsicv4#
对于django 4. * 添加日期字段或日期时间字段到search_fields是默认可用的。只需按照以下步骤:
in admin.py
2022 - 12 - 14或2022(仅按年搜索)或2022 - 12(仅按年和月搜索)或2022 - 12 - 14(仅按年、月和日搜索)