MySQLでNULLを許可するnull=True
にモデルフィールドを設定しましたが、Django Adminを介してフィールドにNULLを割り当てることができません。私も試してみましたblank=True
を設定しますが、これはフィールドを空の文字列に設定するだけです this の後には、フィールド値が文字列 "None"に設定されていたため、機能しませんでした。
何か案は?
空の値をチェックするために、モデルのsave()メソッドを上書きしてみてください:
class MyModel(models.Model):
my_nullable_string = models.CharField(max_length=15, null=True, blank=True)
def save(self, *args, **kwargs):
if not self.my_nullable_string:
self.my_nullable_string = None
super(MyModel, self).save(*args, **kwargs)
ドキュメントのこのセクション を使用すると、できない文字列ベースのフィールドを管理者がNULL
に設定できないように聞こえます。空の文字列を使用します。これはまさにDjangoが行う方法です。他のタイプのフィールドでも機能します。
管理スクリプトをハックするか、そうでないと判断する必要がありますreallyデータベースでNULLにする必要があります。空の文字列でも問題ありません。
通常、両方を渡すとnull=True
およびblank=True
、管理者のフィールドを空白のままにすると、Django
はその値にNULL
を使用します。
編集:
agf
が彼の回答で説明しているように、これはCharField
とTextField
を除くすべての型に当てはまります。
このコードを試してください。ここで、Language.subregion hass null = Trueこのコードは、管理フォームの設定(LanguageAdmin)を上書きし、「subregion」フィールドプロパティを設定します-必須をFalseに設定します
from app.models import Language
from Django.contrib import admin
class Language(models.Model):
subregion = models.ForeignKey(SubRegion, null=True)
code = models.CharField(max_length=10, unique=True)
class LanguageAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['subregion'].required = False
return form
admin.site.register(Language, LanguageAdmin)
私はよくDjangoを管理者のためだけに使用し、dbに多くのNULLを保持する必要があります。このスニペットを使用して、特定のオブジェクトのすべての空の文字列をNULLに設定します。
def save(self, *args, **kwargs):
for var in vars(self):
if not var.startswith('_'):
if self.__dict__[var] == '':
self.__dict__[var] = None
super(MyModel, self).save(*args, **kwargs)
これはDjango= 2.0.1で修正されています-そのバージョン以降、空の値はnull可能なCharfieldsのNoneとして保存されます。
チケット: https://code.djangoproject.com/ticket/4136
コミット: https://github.com/Django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af