2011-08-12 15 views
3

adminのモデルのチェンジリストページで、search_fieldsにDateTimeField "birth"を追加しました。datetimefieldを管理者チェンジリストの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', ] 

追加するとうまくいきます。しかし、エラーが今日出てくる:

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

I'vは、それ以来、私のDjangoのプロジェクトに多くを編集した:

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です。

だから私は何の原因がわからない。ここ

は私の質問です:

  • はジャンゴでサポートされているsearch_fieldsにDateTimeField型を挿入しますか?
  • これを行う正しい方法は何ですか?
  • エラーの原因を教えてください:

新しい進歩:

私はそのSQLをテストしました。

Mysqlでは、正常に動作します。 (両方のMySQLのコマンドラインとDjangoのdbshel​​l)

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 

答えて

2

OK ...私は答えを自分自身を発見しました。日時フィールドの作品でLIKEを使用して

MySQLで
Warning: Incorrect datetime value: '%123%' for column 'birth' at row 1 
  • 、ではなく、オススメ。だから、常に上記の警告があります。ジャンゴでhttp://bugs.mysql.com/bug.php?id=38915

  • 我々はsettings.pyに "デバッグ=真" を設定した場合、Djangoはエラーとして警告を扱います。

したがって、そのモデルのすべての検索に失敗します。

DateTimeFieldはsearch_fieldsに保存されますが、非デバッグサーバでのみ使用されます。タイトルに私の元の質問については


、答えは:

  • ちょうどそれがによると非デバッグサーバ
1

のために働く、search_fieldsにDateTimeField型を追加します。

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

検索フィールドh 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 

、これだけを返す結果を、しかし、あなたが望むならば、あなたは間違いなく空想得ることができます。理想的なソリューションではありませんが、実際には日付で検索することは、直感的には直感的ではありません。

関連する問題