31👍
Override the save and delete methods for the model. How are you planning to add objects to your model?
def save(self, *args, **kwargs):
return
def delete(self, *args, **kwargs):
return
15👍
Database Routers
To take more precautions that your model is read-only, you can use the DATABASE_ROUTERS setting to disable writing on a per model basis:
# 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
I would consider this an insurance policy, and not the primary way to solve the problem. Mikael’s answer, for example, is great but doesn’t cover all cases because some Django operations bypass delete
and save
methods.
See Juan José Brown’s answer in Django – how to specify a database for a model? for a more detailed description of using a database router.
Setting permissions on database user
However, even the database router approach seems to have loopholes, i.e. there are ways to send SQL from Django that bypasses your router code. To be absolutely sure of making something readonly, you should set the permissions on the database user. This question describes how to set up a readonly postgreql user, which could then be the database user set by Django in settings.DATABASES
.
- [Django]-The request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example
- [Django]-Celery – Tasks that need to run in priority
- [Django]-How to merge consecutive database migrations in django 1.9+?
-5👍
You can set managed = False
in your model’s Meta
:
from django.db import models
class MyReadOnlyModel(models.Model):
class Meta:
managed = False
If
False
, no database table creation or deletion operations will be performed for this model. This is useful if the model represents an existing table or a database view that has been created by some other means.
https://docs.djangoproject.com/en/dev/ref/models/options/#managed
- [Django]-Django admin and showing thumbnail images
- [Django]-Is it possible to create a custom admin view without a model behind it
- [Django]-Django: TemplateSyntaxError: Could not parse the remainder