我正在使用Django管理员来管理我的数据。我有以下表格:Users
,Groups
和Domains
。 Users
与Groups
和Domains
具有多对多关系。 Domains
与Groups
有一对多的关系。当我从User
中删除Domain
时,我还想删除Users_Groups
中属于{{1}的特定User
和Groups
的所有条目}}
我该怎么做?我在哪里放代码?
感谢。
答案 0 :(得分:1)
Django book(具体来说,Appendix B)似乎建议您覆盖delete
模型类上的User
方法,并让它触发额外的删除。
答案 1 :(得分:1)
我建议覆盖保存,但我猜你正在使用django.contrib.auth.User对象。在这种情况下,您可以使用pre_save信号完成相同的操作:
def manage_domains(signal,**kwargs):
if kwargs.has_key('instance'):
instance = kwargs['instance']
else: return
old_instance = User.objects.get(pk=instance.pk)
instance_categories = instance.categories.all()
for group in old_instance.groups.all():
if group not in instance_categories:
instance.groups.clear()
pre_save.connect(manage_domains, sender=User)
这甚至不是一个有效的解决方案。将会发生的事情是,当保存用户对象时,将对内存中的对象进行上述更改,然后保存将覆盖数据库中的对象。您不仅要遇到数据库,而且还要查看对象的未修改版本是否与您要保存的内容一致,但是您还要循环使用两个类别集,这两个类都需要数据库命中加载。
在这里提高效率的最佳方法是将ManyToMany字段管理器本身子类化,因为这是在内存中发生变化时注意的变化,而不仅仅是事后比较状态。但这将涉及更多,并且还需要您放弃内置的User对象。