我正在使用django-rest-framework并在我具有默认用户模块的应用程序上工作,然后使用UserProfile对其进行扩展并尝试实现“收藏夹”功能,因此我添加了其他表收藏夹。
所以有我的UserProfile模块:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
...
还有我的收藏夹模块:
class Favorite(models.Model):
user = models.ForeignKey(User, related_name='user_favorite', on_delete=models.CASCADE)
song = models.ForeignKey('Song', related_name='song_favorite', on_delete=models.CASCADE)
我打算在电影的收藏夹中添加另一个字段。
有我的序列化器:
class FavoriteSerializer(serializers.ModelSerializer):
class Meta:
model = Favorite
fields = [
'user',
'song'
]
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
"id",
"email",
"first_name",
"last_name",
"username",
"is_active"
)
class UserProfileSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
favorite = FavoriteSerializer(many=True, read_only=True)
class Meta:
model = UserProfile
fields = '__all__'
...
我在UserProfileSerializer
中也有一些create函数,但是在这种情况下我认为它并不重要。
我试图把这部分
最喜欢的= FavoriteSerializer(很多=真,read_only =真)
放入UserSerializer
,但结果相同。
因此,如您所见,我在“ UserProfileSerializer
”中添加了“收藏夹”,字段应显示所有字段,但我的回复中没有收藏夹!没有错误,但只是缺少此字段
我对这部分的看法是这样的:
class UserRetrieve(generics.RetrieveAPIView):
lookup_field = 'user'
serializer_class = UserProfileSerializer
model = UserProfile
queryset = UserProfile.objects.all()
和urls.py
path('api/users/<int:user>', views.UserRetrieve.as_view(),
name='user_retrieve'),
所以我希望看到这样的东西:
{
"user": {
"id": 111,
"email": "4@email.com",
"first_name": "John",
"last_name": "Doe",
"username": "4@email.com",
"is_active": true
},
...
"favorite": [
{
"user": 1,
"song": 1
},
....
]
}
但是我的回复中没有这个“收藏夹”部分。 我在做错什么,如何获取喜欢的歌曲列表?
答案 0 :(得分:1)
我认为UserProfile
和Favorite
模型之间没有任何直接联系。也许您可以使用SerializerMethodField这样从“收藏夹模型”中提取数据:
class UserProfileSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
favorite = serializers.SerializerMethodField()
class Meta:
model = UserProfile
fields = '__all__'
def get_favorite(self, obj):
favs = obj.user.user_favorite.all() # using reverse relation to pull all favorite objects
return FavoriteSerializer(favs, many=True).data