我不知道怎么说这个,所以我将描述这个场景:
我正在制定预算方法。每个预算项目最多有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
现在,用户可以根据需要创建主要类别 - 他们可以根据需要创建大量“主要”类别,“子”类别和“子子”类别。创建一个类别后,他们可以返回并编辑它(可能是他们拼写错误)或甚至删除所有类别。
然后,他们可以根据自己的喜好创建尽可能多的Budget_Items
,按类别进行组织。当Budget_Item
被“使用”(进行购买)时,isUsed
字段将设置为True
。
如果该类别已通过购买“使用”,我想要的是禁止编辑或删除类别。
例如:
我创建了一个名为“Fule”的main
类别。我意识到我拼错了所以我编辑了类别并称之为“燃料”。然后我创建一个Budget_Item
,其主要类别是“Fuel”,价格为50美元。然后我出去花费50美元用于加油,并将我的Budget_Item
标记为“已用”。现在我已经使用Budget_Item
,我不希望能够编辑“Fuel”类别。该记录需要以某种方式锁定。
这有意义吗?这可能吗?
答案 0 :(得分:1)
要防止删除类别,您需要将on_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 documentation中的删除部分阅读更多内容。
要防止模型被编辑,您可以覆盖每个类别模型的保存方法,以检测类别模型是否具有通过购买使用的预算项目:
# 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)
请注意,self.budgets1部分是可能的,因为related_name参数已传递给类别字段创建。
此代码只是您可以执行的操作的一个示例,但有许多方法可以实现您想要的功能,检测类别是否无法修改并停止以某种方式保存。
答案 1 :(得分:0)
假设您使用的是Django管理员,则可以覆盖Category
模型管理员的has_change_permission
和has_delete_permission
方法。
在这些方法中,您可以访问类别对象,因此检查是否存在将Budget_Item
设置为isUsed
的相关True
并非常困难。< / p>