Django——允许字段编辑吗?

Django——允许字段编辑吗?,django,Django,我不知道该怎么说,所以我将描述这个场景: 我正在制定一种预算方法。每个预算项目最多有3个类别(“主”、“子”和“子”)。所以,我有这个: model: Main_Category model: Sub_Category model: Sub_Sub_Category model: Budget_Item field: Description main_cat: FK --> Main_Category sub_cat: FK --> Sub_Category

我不知道该怎么说,所以我将描述这个场景:

我正在制定一种预算方法。每个预算项目最多有3个类别(“主”、“子”和“子”)。所以,我有这个:

model: Main_Category
model: Sub_Category
model: Sub_Sub_Category

model: Budget_Item
    field: Description
    main_cat: FK --> Main_Category
    sub_cat: FK --> Sub_Category
    sub_sub_cat: FK --> Sub_Sub_Category
    amount: decimal
    item_used?: boolean
现在,用户可以创建他们喜欢的主类别——他们可以创建一个庞大的“主”类别列表、“子”类别列表,以及他们需要的任意多个“子”类别列表。创建一个类别后,他们可以返回并编辑它(可能他们拼错了或原来拼错了),甚至一起删除该类别

然后,他们可以创建任意数量的
预算项目
,按类别进行组织。当预算项目被“使用”(进行采购)时,
isUsed
字段设置为
True

我想要的是不允许编辑或删除通过购买“使用”的类别

例如:

我创建了一个名为“Fule”的
main
类别。我意识到我把它拼错了,所以我编辑了这个类别,把它叫做“燃料”。然后我创建了一个
预算项目
,它的主要类别是50美元的“燃料”。然后我出去花50美元买汽油,并将我的
预算项目标记为“已使用”。既然我已经使用了
Budget\u项目
,我不想编辑类别“Fuel”。那张唱片需要以某种方式锁定


这有意义吗?这可能吗?

假设您使用的是Django管理员,您可以覆盖您的
类别
模型管理员的和方法


在这些方法中,您可以访问category对象,因此检查是否存在相关的
Budget\u项目
s,并且
isUsed
设置为
True

要防止删除类别,您需要将on\u delete=models.PROTECT参数传递给外键,如下所示:

class BudgetItem(models.Model):
    ....
    main_cat = models.ForeignKey(MainCategory, on_delete=models.PROTECT, related_name='budgets1')
    sub_cat = models.ForeignKey(SubCategory, on_delete=models.PROTECT, related_name='budgets2')
    sub_sub_cat = models.ForeignKey(SubSubCategory, on_delete=models.PROTECT, related_name='budgets3')
    ....
您可以在Django中阅读有关删除部分的更多信息

要防止编辑模型,您可以覆盖每个类别模型的保存方法,以检测该类别模型是否有通过采购使用的预算项目:

# Overriding the save method of the MainCategory model
def save(self, *args, **kwargs):
    # Checking if there aren't budget items that belongs to this category and
    # has been used through a purchase so this category can be changed.
    if not self.budgets1.filter(item_used=True).exists():
        super(MainCategory, self).save(*args, **kwargs)   
请注意,part self.budgets1是可能的,因为相关的_name参数已传递给类别字段创建

这段代码只是您可以做的一个示例,但是有很多方法可以实现您想要的,它的技巧是检测类别是否无法修改并以某种方式停止保存