覆盖delete_selected以检查django 1.10中其他表中存在的记录

时间:2017-06-08 09:28:31

标签: django

我正在使用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显示警告,当我单击是时,即使有记录,它也会删除该类型。我想绝对阻止删除。

2 个答案:

答案 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”是您的函数名称。