我正在使用 Django admin 来管理我的数据。我有以下表格:Users
、Groups
和Domains
。与和Users
都有多对多的关系。与 有一对多的关系。当我从 a中删除 a 时,我还想删除该特定且属于.Groups
Domains
Domains
Groups
User
Domain
Users_Groups
User
Groups
Domain
我该怎么做呢?我把代码放在哪里?
谢谢。
我正在使用 Django admin 来管理我的数据。我有以下表格:Users
、Groups
和Domains
。与和Users
都有多对多的关系。与 有一对多的关系。当我从 a中删除 a 时,我还想删除该特定且属于.Groups
Domains
Domains
Groups
User
Domain
Users_Groups
User
Groups
Domain
我该怎么做呢?我把代码放在哪里?
谢谢。
我建议覆盖保存,但我猜你正在使用 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)
这甚至不是一个有效的解决方案。会发生的是,当保存一个 User 对象时,会对内存中的对象进行上述更改,然后保存将覆盖数据库中的对象。您不仅遇到了麻烦,不仅要访问数据库以查明对象的未修改版本是否与您要保存的内容一致,而且还要遍历两个类别集,两者都需要数据库命中装载。
在这里提高效率的最好方法是对 ManyToMany 字段管理器本身进行子类化,因为这是关注内存中发生的变化,而不是仅仅在事后比较状态。但这会涉及更多,并且还需要您放弃内置的 User 对象。