将Django模型设为只读?

时间:2010-12-02 10:44:14

标签: django django-models

它在锡上说的是什么。有没有办法让Django模型只读?

我的意思是一个Django模型,其中一旦创建了记录,就无法编辑它们。

这对于记录交易历史记录的模型非常有用。

4 个答案:

答案 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)