JSONField
を設定してDjango
に新しいリストのデフォルト値を設定する最良の方法は何ですか?
フィールドの1つがアイテムのリストであるモデルがあります。アイテムが設定されていない場合、モデルには空のリストが必要です。
from Django.models import Model
class MyModel(Model):
the_list_field = JSONField(default=[])
これはそれを行うための最良の方法ですか?代わりにlist
を使用するように切り替える必要がありますか?
ありがとう!
JSONFieldのDjangoドキュメント によると、default=list
を使用すると、フィールドのすべてのインスタンス間で共有され、一部のオブジェクトにつながる可能性のある可変オブジェクトが作成されるため、実際にはdefault=[]
デフォルトでは空のリストはありません。
これはDjango.contrib.postgres.fields.JSONField
だけでなく、他のすべての種類のオブジェクトや関数にも当てはまることに注意してください in Python一般的に 。
ドキュメントからの引用:
フィールドにデフォルトを指定する場合は、リストなどの呼び出し可能オブジェクト(デフォルトが空の場合)またはリストを返す呼び出し可能オブジェクト(関数など)であることを確認してください。 default = []を誤って使用すると、すべてのインスタンス間で共有される変更可能なデフォルトが作成されます
JSONField(default=list)
over JSONField(default=[])
を使用します
JSONField(default=dict)
over JSONField(default={})
を使用します
list
とdict
は呼び出し可能ですが、 "[]"は呼び出し可能ではありません。 (あなたはできません[]()
)
いくつかのデータを使用してインスタンス化する場合は、次の操作を実行できます。
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)