Как я могу сделать модель только для чтения?

Можно ли использовать только модель Django? Нет создания, обновления и т.д.

N.B. этот вопрос отличается от:

Сделать модель Django доступной только для чтения? (этот вопрос позволяет создавать новые записи)

Целая модель как доступная только для чтения (касается только интерфейса администратора Django - я бы хотел, чтобы модель читалась только во всем приложении)

Ответ 1

Отменить методы сохранения и удаления для модели. Как вы планируете добавлять объекты к своей модели?

def save(self, *args, **kwargs):
     return

def delete(self, *args, **kwargs):
     return

Ответ 2

База данных Маршрутизаторы

Чтобы принять дополнительные меры предосторожности, чтобы ваша модель была доступна только для чтения, вы можете использовать параметр DATABASE_ROUTERS, чтобы отключить запись для каждой модели:

# settings.py
DATABASE_ROUTERS = ('dbrouters.MyCustomRouter', )


# dbrouters.py
class MyCustomRouter(object):
    def db_for_write(self, model, **hints):
        if model == MyReadOnlyModel:
            raise Exception("This model is read only. Shame!")
         return None

Я бы посчитал это страховым полисом, а не основным способом решения проблемы. Ответ Микаэля, например, хорош, но не охватывает все случаи, потому что некоторые операции Django обходят методы delete и save.

Смотрите ответ Хуана Хосе Брауна в Django - как указать базу данных для модели? для более подробного описания использования базы данных маршрутизатора.

Установка разрешений для пользователя базы данных

Однако даже в подходе к маршрутизатору базы данных, похоже, есть лазейки, то есть есть способы отправки SQL из Django, который обходит код вашего маршрутизатора. Чтобы быть абсолютно уверенным в создании чего-либо только для чтения, вы должны установить права доступа для пользователя базы данных. В этом вопросе описывается, как настроить пользователя Postgreql, доступного только для чтения, который затем может установить пользователь базы данных Django в settings.DATABASES.

Ответ 3

Througth это очень старый вопрос - это будет полезно: https://docs.djangoproject.com/en/dev/ref/models/options/#managed

  

Если False, для этой → > модели не будут созданы операции создания или удаления таблицы базы данных. Это полезно, если модель представляет существующую таблицу или представление базы данных, которое было создано другими способами.