它在锡上说的是什么。有没有办法让Django模型只读?
我的意思是一个Django模型,其中一旦创建了记录,就无法编辑它们。
这对于记录交易历史记录的模型非常有用。
答案 0 :(得分:10)
您可以覆盖模型的保存方法并检查它是否是现有实体,在这种情况下您不会保存任何更改:
def save(self, *args, **kwargs):
if self.id is None:
super(ModelName, self).save(*args, **kwargs)
因此,在此示例中,您仅在实体尚未获得id
时保存更改,这仅仅是当它是尚未插入的新实体时。
答案 1 :(得分:3)
您可以覆盖保存方法,如果您愿意,也不要调用super。这是实现这一目标的一种相当简单的方法。
# 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
如果尝试删除或更新而不是简单地返回,您可能还应该引发异常。您希望向用户发出正在发生的信号 - 该行为无效。
答案 2 :(得分: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
答案 3 :(得分:1)
如果您不希望尝试修改记录以无提示方式失败:
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)