Django - 保存前检查其他对象

时间:2017-11-17 21:44:11

标签: python django

我想覆盖内置的django .save()方法来对数据库中的所有其他对象执行检查。

For example:

class User(models.Model):
    name = models.CharField(max_length=120)

class Admin(models.Model):
    name = models.CharField(max_length=120)

class SecurityGroup(models.Model):
    name = models.CharField(max_length=120)
    users = models.ManytoManyField(User)
    admins = models.ManytoManyField(Admin)

    def save(self, *args, **kwargs):

        # check admins don't exist in any other SecurityGroup prior to save

        super(SecurityGroup, self).save(*args, **kwargs) # Call the "real" save() method.

developer documentation示例非常简单,并没有描述这种类型的预保存检查。

我尝试在.save()添加行,例如:

`self.objects.filter(admins__name=self.admins.name).count()`

调用其他SecurityGroup对象,但收到错误:

`Manager is not accessible via SecurityGroup instance`

是否可以在SecurityGroup模型内部实现此保存功能,或者是否需要创建form并使用SecurityGroup.save(commit=False)进行此类预保存检查?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

对我有用的解决方案是覆盖form中的模型admin.py。这样可以简单地检查管理员是否已经存在于SecurityGroup中。

from django.contrib import admin
from django.forms import ModelForm

from security.models import SecurityGroup


class SecurityGroupAdminForm(ModelForm):

    class Meta:
        model = SecurityGroup
        fields = '__all__'

    def clean(self):    
        # CHECK 1
        if admins:
            admins = self.cleaned_data['admins']

        for a in admins:
            existing_group = SecurityGroup.objects.filter(users__username=a.username)

            if existing_group:
                raise Exception("message")



        return self.cleaned_data

然后,在同一个admin.py文件中,将自定义表单指定为感兴趣模型的管理员注册的一部分(在本例中为SecurityGroup):

class UserSecurityGroupAdmin(admin.ModelAdmin):

    # class Meta:
    model = UserSecurityGroup
    form = UserSecurityGroupAdminForm

admin.site.register(UserSecurityGroup, UserSecurityGroupAdmin)

答案 1 :(得分:-1)

错误是通过模型实例访问模型的管理器引起的。你应该使用

self.model_class().objects