Django создать объект - использовать значение по умолчанию для None - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть модель Django, в которой есть несколько необнуляемых полей со значениями по умолчанию.

class Article(models.Model):
    id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
    code = models.CharField(max_length=200, default=uuid4, unique=True, null=False)
    company = models.CharField(max_length=200, default=uuid4, unique=True, null=False)

Теперь я хочу сделать

Article.objects.get_or_create(company=company, code=am_row['Article code'])

Но здесь проблема am_row['Article code'] или company может быть None, и в этом случае я просто хочу, чтобы новая модель создавалась с использованием значений по умолчанию для этих полей.

В настоящее время передача None вызывает ошибку NOT NULL constraint failed.Как я могу достичь этого?

Так что я думаю, что это сводится к достижению

Article.objects.create(company=company, code=am_row['Article code'])

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете переопределить метод get_or_create в менеджере моделей, например, так:

class CustomManager(models.Manager):
    def get_or_create(self, **kwargs):
        defaults = kwargs.pop('defaults', {})  # popping defaults from values
        for key, value in kwargs.items():
            if value == None:
                kwargs[key] = defaults.get(key)
        return super(CustomManager, self).get_or_create(**kwargs)


class Article(models.Model):
    # ...
    objects = CustomManager()

Затем используйте его в своем представлении так:

Article.objects.get_or_create(
     company=company,
     code=am_row.get('Article code'),
     defaults={
        'company': uuid.uuid4(),
        'code': uuid.uuid4()
     }
)

Если вы хотитефункциональность по умолчанию get_or_create, затем используйте:

objects = Article._base_manager
objects.get_or_create(...)
0 голосов
/ 07 февраля 2019

Я бы использовал оператор or в этом случае.Посмотрите на пример.Если x равно None, будет передано некоторое значение по умолчанию:

In [1]: import uuid

In [2]: def some_function(something):
   ...:     print(f'Something is {something}')
   ...:

In [3]: x = None

In [4]: some_function(x or uuid.uuid4())
Something is 518d7187-f74d-4620-90de-6104698a7d07

In [5]: x = 'Hello, world!'

In [6]: some_function(x or uuid.uuid4())
Something is Hello, world!
...