как получить поля foreignkey в сериализаторе

#django-models #django-rest-framework #django-serializer

Вопрос:

В сериализаторе класса я пытаюсь получить сведения о категории, такие как «имя», но следующий код дает мне идентификатор внешнего ключа

models.py

 
class Category(MP_Node, Timestamps):
    name = models.CharField(_('Name'), max_length=255, db_index=True)


class VideoCategory(Category):
    image = models.ImageField(upload_to='video_categories', blank=True, null=True, max_length=255)


class VideoCategoryVideo(BaseModel, Timestamps, SoftDelete):
    video = models.ForeignKey(Video, on_delete=models.CASCADE)
    category = models.ForeignKey(VideoCategory, on_delete=models.CASCADE, null=True)

 

serializers.py

 
class VideoCategoryVideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = VideoCategoryVideo
        fields = ('category', )

class VideosDetailsListSerializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField()
    class Meta:
        model = Video
        fields = ('id', 'create_date', 'category')

    def get_category(self, data):
        cate = VideoCategoryVideo.objects.filter(video=data.id)
        category = VideoCategoryVideoSerializer(cate, many=True)
        return category.data
 

результат таков:

                 "category": [
                    {
                        "category": 1
                    }]
 

но ожидаемый результат таков

    "category": [
                    {
                        "name": "cate_name"
                    }]
 

Ответ №1:

Вы можете добавить CharField в VideoCategoryVideoSerializer и указать source значение, как это:

 class VideoCategoryVideoSerializer(serializers.ModelSerializer):
    name = serializers.CharField(source='category.name', read_only=True)
    class Meta:
        model = VideoCategoryVideo
        fields = ('category', 'name')
 

Это подскажет сериализатору, для чего нужно получить значение name из соответствующей категории.