Сделать модель Django доступной только для чтения?
Что говорится на олове. Есть ли способ сделать модель Django доступной только для чтения?
Под этим я подразумеваю модель Django, в которой после создания записей они не могут быть отредактированы.
Это было бы полезно для модели, которая записывает историю транзакций.
Ответы
Ответ 1
Вы можете переопределить метод сохранения модели и проверить, является ли он существующим объектом, и в этом случае вы не сохраните никаких изменений:
def save(self, *args, **kwargs):
if self.id is None:
super(ModelName, self).save(*args, **kwargs)
Таким образом, в этом примере вы сохраняете изменения только тогда, когда объект еще не получил id
, но это только тот случай, когда он еще не вставлен.
Ответ 2
Вы можете переопределить метод сохранения и не вызвать супер, если хотите. Это будет довольно простой способ сделать это.
# blatantly ripped the save from another answer, since I forgot to save original model
def save(self, *args, **kwargs):
if self.id is None:
super(ModelName, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
return
Вероятно, вы также должны возбудить исключение, если попытка удаления или обновления происходит вместо простого возврата. Вы хотите сообщить пользователю, что происходит, - что поведение недействительно.
Ответ 3
В дополнение к другим решениям: Если ваша основная цель - избежать доступа к записи от администратора, вы можете изменить используемый класс администратора, чтобы никто не имел права на добавление/изменение:
class HistoryAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return False
def has_change_permission(self, request, obj=None):
return False
def has_delete_permission(self, request, obj=None):
return False
Ответ 4
Если вы не хотите, чтобы попытка записи записи была неудачной:
def save(self, *args, **kwargs):
if self.pk:
(raise an exception)
super(YourModel, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
(raise an exception)