Как я могу позволить администратору django установить поле в NULL? - PullRequest
31 голосов
/ 09 августа 2011

Я установил для поля моей модели значение null=True, что позволяет использовать NULL в MySQL, но я не могу назначить NULL для этого поля через Django Admin. Я попытался также установить blank=True, но это просто устанавливает в поле пустую строку. После это также не сработало, так как значение поля было установлено равным "None", строка.

Есть идеи?

Ответы [ 6 ]

28 голосов
/ 09 августа 2011

Попробуйте переписать метод 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)
17 голосов
/ 09 августа 2011

В этом разделе в документах звучит так, как будто вы не можете установить для строкового поля значение NULL через администратора;он будет использовать пустую строку.Это именно так, как это делает Джанго.Он будет работать для других типов полей.

Вам придется либо взломать скрипт администратора, либо решить, что действительно не должно быть NULL в базе данных;пустая строка в порядке.

7 голосов
/ 09 августа 2011

Обычно, когда вы передаете оба значения null=True и blank=True, если вы оставляете поле пустым в администраторе, Django будет использовать NULL в качестве значения.

РЕДАКТИРОВАТЬ:

, как объясняет agf в своем ответе, это верно для всех типов, кроме CharField и TextField.

5 голосов
/ 11 мая 2014

попробуйте этот код, здесь 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)
4 голосов
/ 18 мая 2013

Я часто использую Django только для администратора, и мне нужно сохранить большое количество 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)
2 голосов
/ 16 января 2018

Обратите внимание, что это исправлено в Django 2.0.1 - начиная с этой версии, пустые значения будут сохраняться как None для обнуляемых Charfields.

Билет: https://code.djangoproject.com/ticket/4136

Фиксация: https://github.com/django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...