как добавить поле datetime в search_fields списка изменений администратора - PullRequest
4 голосов
/ 12 августа 2011

На странице списка изменений модели для администратора, я добавил DateTimeField "Birth" к search_fields.

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

это db sql:

u'SELECT COUNT(*) FROM `data_log` WHERE (`data_log`.`id` LIKE %2011-07-12% OR `data_log`.`birth` LIKE %2011-07-12% )'

С тех пор я много редактировал проект моего django.

, поэтому я не знаю, с чем это связано.

вот мой вопрос:

  • вставить DatetimeField в поля поиска, поддерживаемые django?
  • как правильно это сделать?
  • есть идеи о моей ошибке?

Новый прогресс:

Я тестировал этот sql.

В Mysql все работает хорошо.(и командная строка mysql, и 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 та же ошибка:

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

Ответы [ 3 ]

2 голосов
/ 15 августа 2011

хорошо ... Я нашел ответ сам.

    Warning: Incorrect datetime value: '%123%' for column 'birth' at row 1
  • В mysql, используя LIKE для работы с полями даты и времени, но не рекомендуется. Таким образом, всегда есть предупреждение выше. http://bugs.mysql.com/bug.php?id=38915

  • В Django, если мы установим " Debug = True " в settings.py , django обработает это предупреждение как ошибку.

Итак, все поиски этой модели завершаются неудачей.

Я сохраню это DateTimeField в search_fields, но оно будет использоваться только на не отладочных серверах.


На мой оригинальный вопрос в заголовке ответ:

  • просто добавьте DateTimeField в search_fields, он работает для не-Debug серверов
1 голос
/ 11 июля 2014

Согласно:

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

поля поиска должны быть текстовым полем, например, CharField или TextField.Вы можете выполнять связанные поиски с помощью внешних ключей и т. П., Но не с другими типами полей.

Начиная с Django 1.6, вы можете настроить функцию get_search_results () поиска администратора.Таким образом, при определении класса администратора я исключил поле даты из поля search_fields и вместо этого включил в него следующее:

def get_search_results(self, request, queryset, search_term):
    # Try to filter by year of purchase
    try:
        int_term = int(search_term)
        queryset |= self.model.objects.filter(birth__year=int_term)
    except:
        pass
    return queryset, use_distinct

Конечно, это возвращает результаты только по годам, но вы можете определенно полюбить, если хотите.На самом деле это не идеальное решение, но поиск по дате - довольно не интуитивный процесс, как только вы начинаете думать об этом.

0 голосов
/ 03 июля 2019
  1. Поле даты или даты и времени не имеет строкового типа
  2. admin.search_fields поддерживает только поля или связанные поля строкового типа
  3. но мы все равно можем искать дату, переопределив get_search_results
  4. см. Документы Django
# app/admin.py

class MaterialAdmin(admin.ModelAdmin):
    ....
    # Don't need to enter 'date'
    search_fields = ('supplier__name', 'service_name')

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)
        try:
            import datetime as dt
            import pytz
            date_obj = dt.datetime.strptime(search_term, '%Y年%m月%d日').date()
            # date_obj = dt.datetime.strptime(search_term, '%Y-%m-%d').date() # choose your own date format
            # date_time_obj = dt.datetime.strptime(search_term,  '%Y-%m-%d %H:%M:%S') # if you want to search datetime field
        except ValueError:
            pass
        else:
            queryset |= self.model.objects.filter(date=date_obj)
            # queryset |= self.model.objects.filter(date=date_time_obj)     # if search datetime
        return queryset, use_distinct

Проверено в Django 2.1.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...