获取模型组合信息及其另一模型“主键侧”的最有效方法是什么?

时间:2012-06-26 06:15:59

标签: python django django-models django-views

我正在处理django用户模型的“扩展”模型。这是我模型的定义:

class UserProfile(models.Model):

    user = models.ForeignKey(User, unique=True, editable=False)
    real_name = models.CharField('Real Name', max_length=20)
    telephone = models.CharField('Tel', max_length=30)
    company = models.CharField('Company', max_length=30)
    department = models.CharField('Department', max_length=30)

正如你所看到的,我的UserProfile模型与django的内置用户模型有一个“一对一”关系,有一个“ForeignKey”,我知道另一个骚动是使用“OneToOneField”,可以请一个人告诉我哪一个更适合或更合适?

现在,我的情况是,我在视图函数中获取了我的UserProfile模型和django的内置User模型的组合信息。此外,我需要在这里做一些分页。

def get_user_list(request):
    rows_per_page=int(request.POST["rows"])
    page_number=int(request.POST["page"])
    user_list = User.objects.all()# You can see that I only got the built-in User ,
    total=user_list.count()       #but how to get my UserProfile efficiently ?

    paginator = Paginator(user_list, rows_per_page)

    try:
        rows = paginator.page(page_number)
    except PageNotAnInteger:

        rows = paginator.page(1)
    except EmptyPage:

        rows = paginator.page(paginator.num_pages)


    result={
        "total":total,
        "rows":rows.object_list,
        }

    jsonSerializer = JSONSerializer()
    return HttpResponse(jsonSerializer.serialize(result),mimetype='application/json')

现在,我的问题是,我如何获得我的UserProile模型和内置用户模型的组合来创建查询集,列表,字典或其他什么,我还需要组合对象以适应我现有的分页代码。:)非常感谢你!

2 个答案:

答案 0 :(得分:1)

您应该阅读django文档中的lookups that span relationships作为入门,然后following relationships backward了解如何正确查询对象:

  

如果模型具有ForeignKey,则外键模型的实例将   有权访问返回第一个实例的Manager   模型。默认情况下,此Manager名为FOO_set,其中FOO为   源模型名称,小写。此Manager返回QuerySets   可以按照“检索”中的描述进行过滤和操作   对象“上面的部分。

因此,在名为user的管理器中,每个profile对象与其所有userprofile_set个对象都存在反向关系:

u = User.objects.get(pk=1)
user_profile = u.userprofile_set.all()

答案 1 :(得分:1)

推荐的解决方案是使用OneToOneField,AUTH_PROFILE_MODULE和user.get_profile(),如下所示:https://docs.djangoproject.com/en/1.4/topics/auth/#storing-additional-information-about-user