2014-10-11 2 views
1

Я хочу сохранить записи в моей базе данных, чтобы их можно было удалить позже. Для того, чтобы определить их, я поставил атрибут key в моем классе Entry в models.py, как показано ниже:Django Python unique = True Expression

class Entry(models.Model): 
    name = models.CharField(max_length=200) 
    key = models.IntegerField(unique=True,default=0) 

Каждый раз, когда я начинаю сервер, я найду самый большой ключ, который находится в Entry.objects.all().

Каждый раз, когда я создаю первый новый Entry после запуска сервера, я хочу взять key я нашел в самом начале, увеличить его на 1, а затем установить его в качестве key для моего нового Entry. Для каждого последующего Entry я просто возьму key предыдущего элемента, увеличьте его на 1 и. установите его как key для моих новых Entry

Однако, прежде чем я это сделаю, я хочу знать, что Django считает уникальным. Например, если я добавил три записи изначально с ключами 1, 2 и 3, а затем я удаляю последний элемент клавишей 3. Если я затем перезагружу сервер, самый большой key я найду 2, а следующий Entry Я добавлю, будет key 2 + 1, что равно 3.

Это key уникально? Он был введен ранее, но я удалил этот элемент вправо? Итак, уникальность определяется тем, что я ввел в прошлом, или просто в зависимости от элементов, находящихся в настоящее время в базе данных?

Кроме того, не Джанго постоянно отслеживать все экземпляры Entry, что я добавил, так что это будет как-то знать, если я добавил Entry с key3 раньше?

Обратите внимание, что мои данные хранятся в файле с именем db.sqlite3

Спасибо.

+0

Возможно, вы хотите использовать функцию автоинкремента. – tcooc

ответ

0

Ничего из этого не имеет ничего общего с Django. Это чистый материал базы данных: уникальные ограничения обрабатываются исключительно базой данных, в вашем случае SQLite, хотя функциональность точно такая же и для других БД.

Конечно, уникальное ограничение учитывает только те строки, которые существуют на самом деле: какова будет точка в противном случае?

Есть и другие вещи, которые следует учитывать и с вашим предложением. В частности, существует проблема условий гонки: если вы делаете запрос, чтобы получить максимальное значение ключа, а затем создайте новую строку с ключом + 1, вы рискуете другим пользователем, тем временем добавив свою собственную строку в ключ +1. Намного лучше, как предлагают Iris и ryanageles, использовать встроенный первичный ключ, который уже автоматически определяется как поле id.

+0

Я понимаю. У меня только один пользователь, так как это для проекта. Я попробую и просто с id. – user4052205

0

попытаться добавить primary_key=True в ваше ключевое поле.

+1

Что это будет делать? И знаете ли вы что-нибудь о других вещах, которые я спросил? – user4052205

2

Кажется, что вы ищете что-то, что уже существует; У моделей есть поле id по умолчанию, которое уникально и монотонно (новые записи имеют более высокий идентификатор).

+0

Я мог бы использовать это, но так как мой шаблон был структурирован, я не смог передать идентификатор изображения, которое я удалял. Возможно, я его реструктурирую. – user4052205

Смежные вопросы