Django CharField unique = True, кажется, не работает, в то время как unique = True установлен - PullRequest
1 голос
/ 20 января 2020

Я использую Django 3.0.2 и базу данных sqlite3.

Я установил следующие простые модели:

from django.db import models


class Description(models.Model):
    IDENTIFIER_LENGTH = 30
    identifier = models.CharField(max_length=IDENTIFIER_LENGTH, blank=False, unique=True, primary_key=True)

Странно, но unique=True не работает. Следующий код, запущенный в режиме оболочки

from testunique.models import Description
object = Description('first-object')
object.save()
object.save()

, не вызывает ошибок. Для справки вот код SQL миграций:

BEGIN;
--
-- Create model Description
--
CREATE TABLE "testunique_description" ("identifier" varchar(30) NOT NULL PRIMARY KEY);
COMMIT;

Что здесь не так? Спасибо за ответ.

1 Ответ

1 голос
/ 20 января 2020

Django считает записи с установленным первичным ключом записями, уже имеющимися в базе данных. Следовательно, не выполнит запрос INSERT …, а UPDATE …. Иногда он используется как трюк для установки первичного ключа в Django на None для создания копии данной записи (с тех пор Django сделает еще один INSERT … запрос).

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

Description.objects.<b>create(</b>name='first-object'<b>)</b>
Description.objects.<b>create(</b>name='first-object'<b>)</b>  # raises an error

или вы можете работать с force_insert=True:

Description(name='first-object').save(<b>force_insert=True</b>)
Description(name='first-object').save(<b>force_insert=True</b>)  # raises an error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...