通过链接过滤模型访问模型

时间:2017-10-23 21:03:55

标签: python django

我有三个模型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的答案中得到了一切,谢谢。

4 个答案:

答案 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)