我有以下模型:
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
在创建过程中可编辑,而在更新过程中却不可编辑?
到目前为止的方法:
Making a field read-only in django admin
答案 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')