我有三个模型Person,User和Profile。个人资料将一个人链接到这样的用户:
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE
)
person = models.OneToOneField(
Person,
on_delete=models.CASCADE
)
在我的详细信息视图中,我想通过所选人员获取用户名。
class PersonDetailView(DetailView):
model = Person
template_name = 'people/person_detail.html'
def get_context_data(self, **kwargs):
context = super(PersonDetailView, self).get_context_data(**kwargs)
profile = Profile.objects.filter(person_id=Person.objects.get(pk=self.kwargs['pk']))
# this line is the problem I guess
user = User.objects.get(pk=profile.user.user_id)
context['user_person'] = user
return context
使用此代码我收到错误
'查询集'对象没有属性'用户'
也许这是一个愚蠢的问题,但我迷失了。 如何从一个人过滤的个人资料中获取用户?
在此先感谢,我希望我能够明确表达我的意见。
修改
我在Robert Townley的答案中得到了一切,谢谢。
答案 0 :(得分:2)
该行说:
profile = Profile.objects.filter(person_id=Person.objects.get(pk=self.kwargs['pk']))
应该从查询集中获取配置文件:
profile = Profile.objects.get(person_id=Person.objects.get(pk=self.kwargs['pk']))
如果你做"过滤()"您将收到一个查询集。如果你做" get()"您将收到与该查询集匹配的唯一对象。你也可以这样做:
profile_queryset = Profile.objects.filter(person_id=Person.objects.get(pk=self.kwargs['pk']))
profile = profile_queryset.first()
注意:只有在您确定Profile对象存在或者您将收到DoesNotExist错误时才执行此操作。
答案 1 :(得分:0)
如果我错了,请纠正我,但看起来你正在创建一个关系表来连接一个人和一个用户。
您不必在django中创建关系表。
相反,你应该添加一个外键 https://docs.djangoproject.com/en/1.11/ref/models/fields/#module-django.db.models.fields.related
答案 2 :(得分:0)
正如我所看到的,你可以使用简单的洗脱剂作为你的逻辑,
class PersonDetailView(DetailView):
model = Person
template_name = 'people/person_detail.html'
def get_context_data(self, **kwargs):
context = super(PersonDetailView, self).get_context_data(**kwargs)
context['user_person'] = self.request.user
# Just only one action
return context
答案 3 :(得分:0)
看起来你需要这个:
class PersonDetailView(DetailView):
model = Person
template_name = 'people/person_detail.html'
def get_context_data(self, **kwargs):
user = self.object.profile.user if hasattr(self.object, 'profile') else None
return super(PersonDetailView, self).get_context_data(user_person=user, **kwargs)