Django:我应该在哪里查询与其他模型相关的User

时间:2016-09-19 17:46:02

标签: python django django-models django-orm django-managers

我正在编写一个定义用户组的Django应用程序。用户可以是许多组的一部分。

我希望能够从组列表中检索至少是其中一个组的成员并且没有重复的用户。

所以我写了一个查询来完成它。该方法将采用group_id列表并简单地返回用户列表。 我的问题是:放置该方法的最佳位置在哪里?

我正在考虑为我的群组模型创建自定义管理器。但它似乎不符合逻辑,因为我的方法会向我返回一个用户列表。

根据文件:https://docs.djangoproject.com/en/1.8/topics/db/managers/

模型的经理应该包含有关该模型的查询。

经过一些研究,我发现不建议扩展django.auth.models.User管理器(至少在我的情况下)。

目前,我只是将我的方法放在'service.py'文件中,但我想知道是否有更优雅的方法来完成我想要做的事情。

先谢谢您的建议!

2 个答案:

答案 0 :(得分:0)

我假设ManyToManyFieldUser之间存在Group关系,如下所示?

class Group(models.Model):
    users = models.ManyToManyField('auth.User')

我认为没有理由写一个方法来实现这一点,它只是对filter的单行调用:

User.objects.filter(groups__in=group_ids)

如果你必须把它作为一种方法,我不认为那是一个"官员"这个地方。 User经理可能最接近,但正如您所说,向User添加自定义经理是一件痛苦的事。 Django应用程序只是python代码,并且对于非框架方法的位置并不是非常规范的,所以把它放在对你的代码/团队有意义的地方。

请注意Django already provides all of this functionality,甚至可以为模型Group命名,因此您似乎正在重新创建自己的轮子。

答案 1 :(得分:0)

在views.py中,您可以使用以下功能并在视图中调用它:

def get_groups_users(*groups):
    users = User.objects.filter(groups__name__in=list(groups))
    return list(set(users))