Рассмотрим следующую модель Django:
class Outlet(models.Model):
a = models.CharField(max_length=253, primary_key=True, db_index=True)
def _split(self, idx):
if not self.a:
return None
return self.a.split(".")[idx]
@property
def b(self):
return self._split(0)
@property
def c(self):
return self._split(1)
Пара с этим классом, зарегистрированным в admin:
@admin.register(Outlet)
class OutletAdmin(admin.ModelAdmin):
fields = ("a", "b", "c")
readonly_fields = ("b", "c")
Начните с пустой БД:
![enter image description here](https://i.stack.imgur.com/ADWLZ.jpg)
Добавьте один экземпляр в интерфейсе администратора:
![enter image description here](https://i.stack.imgur.com/g6RCY.jpg)
![enter image description here](https://i.stack.imgur.com/EhGs6.jpg)
Хорошо, пока.Теперь перейдите к изменению этого экземпляра:
![enter image description here](https://i.stack.imgur.com/GD96Z.jpg)
![enter image description here](https://i.stack.imgur.com/WM1xS.jpg)
Да?Что сейчас произошло?Django только что выполнил INSERT, когда можно с уверенностью ожидать, что он выполнит UPDATE.
Непосредственно с Как Django знает, как ОБНОВИТЬ против INSERT :
Вы можетезаметил, что объекты базы данных Django используют один и тот же метод save () для создания и изменения объектов.Джанго абстрагируется от необходимости использовать операторы SQL INSERT или UPDATE.В частности, когда вы вызываете save (), Django следует этому алгоритму:
- Если для атрибута первичного ключа объекта задано значение, которое оценивается как True (т. Е. Значение, отличное от None, или пустая строка), Django выполняет UPDATE.
- Если атрибут первичного ключа объекта не задан или если UPDATE ничего не обновлял, Django выполняет INSERT.
Now, этот вопрос скажет мне, что это потому, что a
является первичным ключом.Во-первых, я не вижу такого упоминания в документации по Django.Во-вторых, я не могу удалить атрибут primary_key
из a
.
Меня больше интересует знание , почему это так, что вызвано внутренне с Django, и гдеэто задокументировано (если где-нибудь)? Существуют ли другие недокументированные условия, при которых INSERT выполняется, когда вы ожидаете ОБНОВЛЕНИЕ?