如何使用user_id作为外键为扩展的用户模块创建嵌套的序列化器

时间:2019-02-02 00:11:41

标签: python django django-rest-framework

我正在使用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
    },
    ....
    ]
}

但是我的回复中没有这个“收藏夹”部分。 我在做错什么,如何获取喜欢的歌曲列表?

1 个答案:

答案 0 :(得分:1)

我认为UserProfileFavorite模型之间没有任何直接联系。也许您可以使用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