在Django中,如何通过代理模型正确访问相关的代理模型
问题描述:
我想从auth应用中覆盖Django用户和组模型中的get_absolute_url方法。在Django中,如何通过代理模型正确访问相关的代理模型
我的第一个想法是定义一个代理模式,但后来我发现,在usuario.groups
的要素是的Group
代替Grupo
情况下,它也发生在grupo.user_set
情况相同。所以,我扩大了代理模式有点
class Usuario(User):
class Meta:
proxy = True
@models.permalink
def get_absolute_url(self):
return ('ver_usuario', [self.id])
@property
def grupos(self):
return Grupo.objects.filter(user=self.pk)
@grupos.setter
def grupos(self, valor):
self.groups = valor
class Grupo(Group):
class Meta:
proxy = True
@models.permalink
def get_absolute_url(self):
return ('ver_grupo', [self.id])
@property
def usuarios(self):
return Usuario.objects.filter(groups=self.pk)
@usuarios.setter
def usuarios(self, valor):
self.user_set = valor
但后来我看到RelatedManager
方法grupo.usuarios.create(username='test_usuario')
将创建用户,但它不会与组其关联,这是因为grupo.user_set
是ManyRelatedManager
和grupo.usuarios
是QuerySet
。因此,也许创建一个特殊的ManyRelatedManager
...但在这一点上,我觉得这是越来越不必要的复杂。
由于我想替换get_absolute_url
我只需在模板中使用url
标记。但我想知道,如果我想添加其他方法,我该怎么做?
答
通过使用ABSOLUTE_URL_OVERIDES设置,可以基于每个安装覆盖get_absolute_url
。
+0
它适用于用户,但Group没有get_absolute_url方法,它不能覆盖它。 – naw 2010-07-22 21:14:04
不好意思,用你的母语编写代码真是个坏主意。你似乎很熟练掌握英语,所以在今天的通用语言中保留你的代码是一个很好的习惯。 – gruszczy 2010-07-22 15:35:23
那么,这个项目是本地的,只能在西班牙语环境中使用,并由西班牙人进行审查,所以我认为使用西班牙语名称是可取的。在这个例子中,我会在代码示例中翻译变量名称,但是知道它们的含义似乎很简单。 – naw 2010-07-22 15:45:49