我想覆盖内置的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)
进行此类预保存检查?
感谢您的帮助。
答案 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