将自定义用户模型重构为用户UserProfile:我应该创建自定义UserManager还是添加user.get_profile()几十次?

时间:2010-03-30 20:58:30

标签: django django-authentication django-managers

我一直在通过创建UserProfile并使用AUTH_PROFILE_MODULE定义来重构一个从django.contrib.auth.models定制标准用户模型的应用程序。

问题是在整个项目中使用UserProfile中的属性来确定用户看到的内容。

我一直在创建测试并重复输入这种语句:

user = User.objects.get(pk=1)
user_profile = user.get_profile()

if user_profile.karma > 10:
    do_some_stuff()

这很乏味,我现在想知道我是否违反了DRY原则。

创建一个自定义UserManager,在请求用户时自动加载UserProfile数据会更有意义。

我甚至可以迭代UserProfile属性并将它们附加到User模型。这将节省我不得不更新所有对代码丢失的自定义模型属性的引用。

当然,我必须反向处理以允许正确更新User和UserProfile模型。

哪种方法更像Django-esque?

1 个答案:

答案 0 :(得分:1)

就个人而言,我并不打扰get_profile()助手。我只是在UserProfile中使用一对一字段User并设置related_name='projname_profile'

然后你可以使用ORM魔法在一个请求中获取所有内容(我认为select_related仅在Django 1.2中选择反向1-1,但可能是后向移植......):

user = User.objects.select_related().get(pk=1)
profile = user.projname_profile   # or just call it inline