問題タブ [django-mysql]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
58 参照

python - 注釈フィールドは、datetime.datetime ではなく str です

関連モデルのデータを使用してオブジェクトに注釈を付けようとしていますDateTimeField

sqlite3デフォルトのローカルデータベースとMySQL(を使用)を交互に使用しますmysqlclient。SQLite は機能し、MySQL はクラッシュします。

理由は次のとおりです。両方のデータベースのコンパイラ

次のように、int と string のタプルのリストのリストを返します。

SQLite

MySQL

ここで、SQLite バックエンドが想定される datetime フィールドを検出すると、実行時に次のメソッドを使用してコンバーターを生成します。

django.db.backends.sqlite3.operations.DatabaseOperations

これは正常に動作します。

ただし、MySQL バックエンドはこれを行います。

django.db.backends.mysql.operations.DatabaseOperations

その後、Django は<str>タイムゾーンの認識をチェックしようとしてクラッシュします。

環境

上記は、クラッシュを再現するために使用したおもちゃの例です。

実際の本番環境では、MySQL コンパイラは、奇妙なことに、注釈付きの作成者の完全なリストを要求するexecute_sqlとオブジェクトを含む「生の」データのタプルのリストのリストを返し( )、特定の作成者を要求すると文字列を含む同じリストを返します。 1 つ ( )。クエリセットのそれぞれの sql クエリは、単一の WHERE 句の存在によってのみ異なります。datetime.datetimeaction=='list'action=='retrieve'

これにより、私は何か間違ったことをdatetime.datetimeしていて、ドライバーから取得するはずの生のデータを取得していないと思います (Django のバグの可能性がはるかに低いというよりも)。

私は何をすべきか?N+1 は問題外です。これがアプリのメインのオペレーター ビューになり、datetime フィールドは実際には2つの一対多の関係の深さになります。