如何将ManyToMany字段另存为值而不是id

时间:2019-05-08 18:36:24

标签: django-rest-framework

我有以下模型和序列化器,电影和体裁之间具有ManyToMany关系。但是,当我选择具有api的电影的流派时,该影片将以流派ID(而不是流派名称)保存。如何保存类型名称而不是ID。

Models.py:

class Genre(models.Model):
    genre = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.genre

class Movie(models.Model):
    name = models.CharField(max_length=50)
    release_date = models.DateField()
    genre = models.ManyToManyField(Genre, related_name='movie')

Serializers.py

class GenreSerializer(ModelSerializer):
    class Meta:
        model = Genre
        fields = (genre, )

class MovieSerializer(ModelSerializer):
    class Meta:
        model = Movie
        fields = ('id', 'name', 'release_date', 'genre', )

我通过API插入了以下三种流派: 1.恐怖 2.喜剧片 3.动画

当我用恐怖和喜剧类型保存名为“恐怖电影”的电影时,它以下面的类型ID(而不是它们的值)(即恐怖和喜剧)被保存下来:

使用以下api列出所有已保存的电影时,显示如下 / api / movie

{
    "id": 1
    "name": "Scary Movie",
    "release date": 2000-07-13,
    "genre": [
    1,
    2
]
}

如何使电影保存为流派名称而不是流派ID?

1 个答案:

答案 0 :(得分:0)

您可以像这样使用嵌套的序列化器:

class GenreSerializer(ModelSerializer):
    class Meta:
        model = Genre
        fields = (genre,)

class MovieSerializer(ModelSerializer):
    genre = GenreSerializer(many=True)

    class Meta:
        model = Movie
        fields = ('id', 'name', 'release_date', 'genre')

这应该导致:

 [
    {
        "id": 1
        "name": "Scary Movie",
        "release date": 2000-07-13,
        "genre": [
            {
                "genre": "Horror"
            },
            {
                "genre": "Comedy"
            }
        ]
    }, ...
]