2017-11-17 84 views
0

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

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. 

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)这种类型的预保存检查?

感谢您的帮助。

+0

您在通话有错误'超'将其更改为'SecurityGroup',如果你想保存新的实例之前检查,你可以检查'self.pk'是否存在 –

+0

谢谢,我修复了错误。你有更完整的答案来提供吗? – NickBraunagel

+0

请阅读完整评论 –

回答

0

这工作对我来说是覆盖模式的formadmin.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

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

self.model_class().objects 
+0

在研究这个问题时,必须通过django ContentType类(而不是通过Model类实例)访问实例的模型类:https://docs.djangoproject.com/en /1.11/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentType.model_class。使用你描述的方法返回一个AttributeError。 – NickBraunagel

相关问题