禁止更新Django模型字段

时间:2018-11-02 11:37:05

标签: django django-models

我有以下模型:

class Project(models.Model):

    name = models.CharField(max_length=200)

class Task(models.Model):

    name = models.CharField(max_length=200)

    project = models.ForeignKey('Project', on_delete=models.CASCADE,
                                related_name='tasks')

我希望能够在创建过程中为任务选择项目,并禁止在任务创建后对其进行更改。

如何在数据库/模型级别上使Task.project在创建过程中可编辑,而在更新过程中却不可编辑?

到目前为止的方法:

  1. The editable=False option

    • 这适用于管理员/表单级别,而不适用于数据库级别
  2. Making a field read-only in django admin

    • 这也适用于管理员/表单级别,不适用于数据库级别

1 个答案:

答案 0 :(得分:0)

在数据库级别上不确定,但是您可以在此处使用预保存信号,并检查实例是否具有主键,这将确定这是初始保存还是修改。如果对其进行了修改,并且字段已更改,则可以引发异常。

@receiver(pre_save, sender=Task)
def send_hook_on_roadmap_update(sender, instance, **kwargs):
    try:
        obj = sender.objects.get(pk=instance.pk)
    except sender.DoesNotExist:
        pass  # Initial save -- do nothing
    else:
        if not obj.project == instance.project:  # Field has changed
            raise models.ProtectedError('`project` should not be modified')