如何按从另一个模型的OneToOneField继承的字段进行查询

时间:2019-06-16 03:46:04

标签: django django-rest-framework

我正在尝试使用从UserProfile模型继承的字段来查找User模型。如何在User视图中从UserProfile模型访问用户名字段?

我正在使用Django REST框架3.9。根据我的理解,在模型定义中使用@property批注可以使您对该字段进行序列化。而且我在视图中将序列化字段用作lookup_field

这是UserProfile模型。

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, null=True, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    @property
    def username(self):
        return self.user.username

这是序列化程序。

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserProfile
        fields = [
            'user',
            'username',
            'bio',
            'birth_date'
        ]

这是视图。

class UserProfileAPIView(generics.RetrieveUpdateAPIView):
    # permission_classes = [permissions.IsAuthenticated]

    serializer_class = UserProfileSerializer
    lookup_field = 'username'

    def get_queryset(self):
        return UserProfile.objects.all()

    def get_serializer_context(self, *args, **kwargs):
        return {'request': self.request}

这是API网址。

path('<str:username>/profile/', UserProfileAPIView.as_view(), name='profile'),

我希望API返回:username, bio, birth_date,但是我收到此错误:“无法将关键字'username'解析为字段。选择包括:bio,birth_date,id,user,user_id”

2 个答案:

答案 0 :(得分:0)

@property只是这里的python计算字段,只有在对象可用后才可用。但是要获取对象,将无法使用。 lookup_field需要数据库关系。就像我之前说过的,我们不能为此使用username属性。应该是lookup_field = 'user__username'

答案 1 :(得分:0)

将源添加到超链接标识字段。

URL =HyperlinkIdentityField(
     view_name='your_view_name',
     source=User,
     lookup_field='username'
 )