我正在使用django的默认管理仪表板。基本上,我想逐个模型地覆盖delete_selected方法,这样我就可以在允许删除之前检查记录。
我的models.py是:
class Kind(models.Model):
name = models.CharField(max_length=50, unique=True)
addedby = models.ForeignKey(User,related_name='admin_kind')
createdon = models.DateTimeField(auto_now_add=True)
updatedon = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Meta:
ordering = ('name',)
class Item(models.Model):
name = models.CharField(max_length=50)
kind = models.ForeignKey(Kind,related_name="item_kind")
createdon = models.DateTimeField(auto_now_add=True)
updatedon = models.DateTimeField(auto_now=True)
def __str__(self):
return ' , '.join([self.kind.name, self.name])
class Meta:
ordering = ('kind', 'name',)
unique_together = (('name','kind'))
现在我想要的是可以删除一种,我想检查项目中是否有相关记录。如果有,请不要删除它。
但我仍然坚持如何在admin.py中重写delete_selected方法。
def delete_selected(self, request, obj):
'''
Delete Kind only if there are no items under it.
'''
for o in obj.all():
featuredItems = Item.objects.filter(kind=o).count()
if featuredItems == 0:
o.delete()
然而,django显示警告,当我单击是时,即使有记录,它也会删除该类型。我想绝对阻止删除。
答案 0 :(得分:2)
实际上,您正在尝试编写大量代码,只需在模型字段中添加属性即可完成
PROTECT 通过引发ProtectedError(django.db.IntegrityError的子类)来防止删除引用的对象。
class Item(models.Model):
name=models.CharField(max_length=50)
kind=models.ForeignKey(Kind,related_name="item_kind", on_delete=models.PROTECT)
django在删除时显示确认页面,这使您想要实现的目标变得更加困难。
答案 1 :(得分:1)
函数代码是正确的,但您需要明确告诉django使用您自己的函数来删除该模型的对象。您可以通过在admin.py,
中声明一个列表来实现actions = ['delete_selected']
其中“delete_selected”是您的函数名称。