【发布时间】:2011-05-19 01:20:58
【问题描述】:
罐头上写着什么。有没有办法让 Django 模型只读?
我的意思是一个 Django 模型,其中一旦创建了记录,就无法对其进行编辑。
这对于记录交易历史的模型很有用。
【问题讨论】:
标签: django django-models
罐头上写着什么。有没有办法让 Django 模型只读?
我的意思是一个 Django 模型,其中一旦创建了记录,就无法对其进行编辑。
这对于记录交易历史的模型很有用。
【问题讨论】:
标签: django django-models
如果您不希望修改记录的尝试静默失败:
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)
【讨论】:
除了其他解决方案:如果您的主要目标是避免管理员的写入权限,您可以修改使用的管理员类,以便没有人拥有添加/更改权限:
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
【讨论】:
如果你愿意,你可以覆盖 save 方法而不是调用 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
如果尝试进行删除或更新而不是简单地返回,您可能还应该引发异常。您想向用户表明正在发生的事情 - 行为无效。
【讨论】:
您可以覆盖模型的保存方法并检查它是否是现有实体,在这种情况下您将不会保存任何更改:
def save(self, *args, **kwargs):
if self.id is None:
super(ModelName, self).save(*args, **kwargs)
因此,在此示例中,您仅在实体尚未获得 id 时保存更改,仅当它是尚未插入的新实体时才会出现这种情况。
【讨论】:
None ID 也将是新记录。
if not self.id:。毕竟是 python :) 或者:if self.id: raise NotImplementedError("Editing not allowed")