我正在处理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模型和内置用户模型的组合来创建查询集,列表,字典或其他什么,我还需要组合对象以适应我现有的分页代码。:)非常感谢你!
答案 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