我正在尝试使用从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” 。
答案 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'
)