Как создать вложенный сериализатор для расширенного пользовательского модуля с user_id в качестве внешнего ключа - PullRequest
0 голосов
/ 02 февраля 2019

Я использую django-rest-framework и работаю над приложением, в котором у меня есть модуль User по умолчанию, затем UserProfile, чтобы расширить его, и пытаюсь реализовать функцию «Избранное», и по этой причине я добавил дополнительную таблицу Favorites.

Итак, есть мой модуль 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, но я не думаю, что она уместна в этом случае.

IЯ пытался поместить эту часть favourite = FavoriteSerializer (many = True, read_only = True) в UserSerializer, но результат такой же.отобразить все поля, но у меня нет любимых в моем ответе!Там нет ошибки, но он просто пропустил это поле

мой взгляд на эту часть выглядит так:

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 голосов
/ 02 февраля 2019

Я не думаю, что существует прямая связь между моделями 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...