Всякий раз, когда в поле модели вводится значение NULL, переходите к строке по умолчанию - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть такая модель:

class Test(models.Model)
    name = models.CharField(max_length=30, default="Unassigned")

Всякий раз, когда экземпляр этой модели сохраняется с None в поле name, я хочу, чтобы экземпляр сохранялся с "Unassigned".Но если я сделаю это:

>>> test = Test()
>>>test.name = None
>>>test.save()

В настоящий момент произойдет сбой с

django.db.utils.IntegrityError: Сбой ограничения NOT NULL: explorer_api_test.name

в последней строке, поскольку, очевидно, поле name не допускает нулевые значения (в нем нет null=True).

Но , если я разрешаю нулевые значения, ононе будет сохранено со значением по умолчанию "Unassigned", но вместо None.

Что я могу изменить в определении модели , чтобы каждый раз, когда его экземпляр пытался сохранить с помощью Noneв поле он сохраняется со строкой по умолчанию?Вне определения модели я мог бы сделать это:

>>>test = Test()
>>>test.name = None
>>>if test.name is None:
>>>...test.name = "Unassigned"
>>>test.save()

, но я предпочитаю иметь эту логику в самой модели.

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете переопределить метод сохранения следующим образом:

class Test(models.Model):

   field = models.CharField(max_length=30, default="Unassigned", null=True)

   def save(self, *args, **kwargs):
       if self.field == None:
           field_att = self.__class__._meta.get_field('field')
           default_value = field_att.get_default()
           self.field = default_value

       return super(Test, self).save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...