Сделать модель 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)