2017-11-17 83 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

相關問題