web-dev-qa-db-ja.com

DjangoおよびDjango-jsonfieldのJSONFieldのデフォルトを空のリストに設定する方法は?

質問

JSONField を設定してDjangoに新しいリストのデフォルト値を設定する最良の方法は何ですか?

環境

フィールドの1つがアイテムのリストであるモデルがあります。アイテムが設定されていない場合、モデルには空のリストが必要です。

現在のソリューション

from Django.models import Model

class MyModel(Model):
    the_list_field = JSONField(default=[])

これはそれを行うための最良の方法ですか?代わりにlistを使用するように切り替える必要がありますか?

ありがとう!

22

JSONFieldのDjangoドキュメント によると、default=listを使用すると、フィールドのすべてのインスタンス間で共有され、一部のオブジェクトにつながる可能性のある可変オブジェクトが作成されるため、実際にはdefault=[]デフォルトでは空のリストはありません。

これはDjango.contrib.postgres.fields.JSONFieldだけでなく、他のすべての種類のオブジェクトや関数にも当てはまることに注意してください in Python一般的に

ドキュメントからの引用:

フィールドにデフォルトを指定する場合は、リストなどの呼び出し可能オブジェクト(デフォルトが空の場合)またはリストを返す呼び出し可能オブジェクト(関数など)であることを確認してください。 default = []を誤って使用すると、すべてのインスタンス間で共有される変更可能なデフォルトが作成されます

40
jnns

JSONField(default=list) over JSONField(default=[])を使用します

JSONField(default=dict) over JSONField(default={})を使用します

listdictは呼び出し可能ですが、 "[]"は呼び出し可能ではありません。 (あなたはできません[]()


いくつかのデータを使用してインスタンス化する場合は、次の操作を実行できます。

def jsonfield_default_value():  # This is a callable
    return [0, 0]  # Any valid JSON, e.g. `return ["A", "B"]` or `return {price: 0}`

class MyModel(Model):
    the_list_field = JSONField(default=jsonfield_default_value)
5
Nitin Nain