unique_together не заменяет первичный ключ - PullRequest
0 голосов
/ 18 июня 2019

В моем приложении Django я хочу вставить запись с составным первичным ключом. Очевидно, это должно быть возможно с использованием «unique_together». Я совершенно уверен, что этот код работал в прошлом, но по некоторым причинам он, кажется, не работает сейчас. Этот код раньше работал на виртуальной машине Linux, и теперь я размещаю его в Google App Engine. Однако я не понимаю, как это может быть причиной этой ошибки.

class TermsAndConditionsDocument(models.Model):
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, verbose_name=_("Organization"))
    language = models.CharField(_('Language'),choices=LANGUAGE_CHOICES, max_length=5, help_text=_("The language of the content."))
    content = models.TextField()

    class Meta:
        unique_together = ('organization', 'language')

Ошибка:

IntegrityError at /transactions/settings/terms_and_conditions

null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, nl-BE, <p>B</p>, 10).

Согласно тому, что я прочитал, использование «unique_together» должно привести к тому, что Django не понадобится или будет включать идентификатор в качестве первичного ключа. Я проверил базу данных, и поле ID существует. Я не понимаю, откуда по-прежнему исходят ограничение базы данных и поле идентификатора?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Очевидно, как указано в комментариях, поле «id» первичного ключа всегда добавляется, даже если оно вам не нужно.Он должен убираться с вашего пути, поэтому вы даже не замечаете его существования.В моем случае мне потребовалось указать значение при создании новой записи, что не должно работать.

Некоторое время назад я перенес эту базу данных из одной базы данных Postgres в другую базу данных Postgres.,Для этого я использовал метод дампа и загрузки SQL.Кажется, что некоторые последовательности были потеряны во время этой миграции.

Поскольку последовательности отсутствуют, в некоторых полях теперь отсутствовали возможности автоинкремента, объясняя ошибку IntegrityError при вставке.

Чтобы это исправить, я сделалследующее:

1) Экспортировать текущие данные:

manage.py dumpdata > data.json

2) Удалить вашу базу данных и создать новую пустую.

3) Запустить миграцию базы данных:

manage.py migrate

4) Загрузите данные снова, исключая некоторые данные по умолчанию, уже воссозданные Django.

manage.py loaddata --exclude auth.permission --exclude contenttypes data.json 

Эта процедура, похоже, воссоздала последовательности, сохраняя при этом данные.

0 голосов
/ 18 июня 2019

Unique_together только создает ограничение БД (https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together).

Вы можете создать собственный первичный ключ с параметром primary_key https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.Field.primary_key, но вы можете сделать это только для одного поля.

Но я предлагаю оставить поле идентификатора автоинкремента, это лучше работает с Django.

Из-за ошибки вы сохраняете модель? или делать импорт сырья?

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