我有以下型号:
class Application(models.Model):
users = models.ManyToManyField(User, through='Permission')
folder = models.ForeignKey(Folder)
class Folder(models.Model):
company = models.ManyToManyField(Compnay)
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
company = models.ManyToManyField(Company)
我想做的是检查应用程序的用户之一是否与应用程序具有同一家公司(通过文件夹)。如果是这种情况,则不应保存应用程序实例。
问题在于,ManyToManyFields 直到“保存后”信号之后才会更新。
唯一的选择似乎是新的 m2m_changed 信号。但我不确定如何回滚已经发生的保存。
另一种选择是重写保存函数(在 models.py 中,因为我在这里谈论的是管理员),但我不确定如何访问 Manytomanyfield 内容。
最后,我在 admin.py 中阅读了有关重写模型管理中的保存函数的内容,但是我仍然不知道如何访问 Manytomanyfield 内容。
我一直在到处寻找这个,但我遇到的似乎没有一个对我有用。
如果有任何不清楚的地方,请告诉我。
感谢您的帮助!
Heleen
因为我没有得到 Botondus 的回复,所以我决定在Django 用户 Google 群组 http://groups.google.com/group/django-users/browse_thread/thread/fa60dc475f12917b#终于从jaymz那里得到了答案。
我认为 Botondus 方法是正确的方法,但它不太有效。在这种情况下它不起作用的原因是因为我正在对我想要进行验证的字段使用 Through 模型。由于一些早期的反馈,我收到了之前发布的问题,我收集到首先保存应用程序实例,然后保存多对多实例(我相信这是正确的,但如果我错了,请纠正我)。所以我想,如果我对 Through 模型中的 ManyToMany 字段执行验证,这不会阻止保存 Application 实例。但事实上它确实阻止了这种情况的发生。
因此,如果您的模型管理中有一个内联的 ManyToMany 字段,并且您想对该字段进行验证,则可以在 through 模型中指定 clean 函数,如下所示:
admin.py
class PermissionInline(admin.TabularInline):
form = PermissionForm
model = Permission
extra = 3
forms.py
class PermissionForm(forms.ModelForm):
class Meta:
model = Permission
def clean(self):
cleaned_data = self.cleaned_data
user = cleaned_data['user']
role = cleaned_data['role']
if role.id != 1:
folder = cleaned_data['application'].folder
if len(filter(lambda x:x in user.profile.company.all(),folder.company.all())) > 0: # this is an intersection
raise forms.ValidationError("One of the users of this Application works for one of the Repository's organisations!")
return cleaned_data
如果验证导致错误,则不会保存任何内容(应用程序实例和许多用户实例),并且您有机会纠正错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)