2017-11-17 10 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()にラインに追加しようとしている:他のSecurityGroupオブジェクトを呼び出すために

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

が、私はエラーが表示されます。

`Manager is not accessible via SecurityGroup instance` 

は、これが機能内部を節約達成することが可能ですこのタイプの事前セーブチェックにはを作成してSecurityGroup.save(commit=False)を使用する必要がありますか?

ありがとうございました。

+0

通話中にエラーが発生しています ' super'を 'SecurityGroup'に変更し、新しいインスタンスを保存する前に確認したい場合は、' self.pk'が存在するかどうか確認することができます。 –

+0

ありがとう、私はエラーを修正しました。あなたはより完全な回答を提供していますか? – NickBraunagel

+0

please、read full comments –

答えて

0

を使用している必要があります。これにより、管理者が既に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

エラーは、モデルインスタンスを通じてモデルのマネージャにアクセスすることによって発生します。あなたは私のために働いたソリューションは、モデルのformadmin.py内を上書きすることでした

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

関連する問題