Установка ArrayField на ноль или [] - PullRequest
0 голосов
/ 14 апреля 2020
files = fields.ArrayField(models.UUIDField(null=True), blank=True,
                              default=None)

Итак, у меня есть эта строка в моей модели, задача состоит в том, чтобы сохранить массив UUID файлов в поле «файлы», но я все еще получаю ошибку

Поле массива было импортировано из postgres поля, такие как

from django.contrib.postgres import fields

и модели были импортированы

from django.db import models

Вот ошибка при выполнении python manage.py migrate после python manage.py makemigrations

File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 447, in add_field
    self.execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 137, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: column "files" contains null values

Обновление: Дело в том, что поле должно быть необязательным, поэтому, если клиент решит загрузить фотографию или какие-либо файлы, связанные с этой моделью позже, это должно быть сделано

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, вам нужен массив ненулевых UUID:

files = fields.ArrayField(models.UUIDField(), blank=True)

То есть сам массив может не содержать null с.

Для инициализации поля в пустой список, передать фабричную функцию (никогда не изменяемый объект!); list(), как вы знаете, возвращает пустой список.

files = fields.ArrayField(models.UUIDField(), blank=True, default=list)

Если вам нужно различать guish между NULL-файлами и без файлов,

files = fields.ArrayField(models.UUIDField(), blank=True, null=True)

сработает.

(Тем не менее, они files представлены другими моделями? Если это так, то вы действительно можете искать ManyToManyField; поле такого типа не имеет гарантий ссылочной целостности! )

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