为 manytomany 字段检索 api

making a retrieve api for a manytomany field

我正在用 django rest 框架制作一个 API 它应该做的是,它必须 return 某个名人表演或导演的电影。

而且我不知道该怎么做。因为电影模型有很多字段,称为 filmActor 和 filmDirector,我想最好通过扩展 ModelSerializer class.

来实现 api
# Models.py

class Celebrity(models.Model):
    celebID = models.AutoField(primary_key=True)
    nameOf = models.CharField(max_length=100, unique=True)
    details = models.TextField(null=True)

class Film(models.Model):
    filmID = models.AutoField(primary_key=True)
    title = models.CharField(max_length=150)
    filmActor = models.ManyToManyField(Celebrity, related_name='actor')
    filmDirector = models.ManyToManyField(Celebrity, related_name='director')

# Serializers.py
class CelebrityRetrieveSerializer(serializers.ModelSerializer):
    # TO BE DONE

感谢“_set”,您可以访问 many-to-many 相关对象。 这样的事情应该有效:

class FilmSerializer(serializers.ModelSerializer):

    class Meta:
        model = Film
        fields = ('filmID', 'title')

class GenreRetrieveSerializer(serializers.ModelSerializer):
    film_set = FilmSerializer(many=True)
    
    class Meta:
        model = Genre
        fields = '__all__'

@ThomasGth 给出的答案只有在您有 1 个 foreign-key 或 many-to-many 字段时才有效。

要使用两个外键执行此操作,您必须在 serializers.py 中命名该字段,即为 models.py 中的 related_name 字段指定的名称。所以代码应该是这样的:

class CelebrityRetrieveSerializer(serializers.ModelSerializer):
    class FilmSerializer(serializers.ModelSerializer):
        class Meta:
            model = Film
            fields = ('title',)
    
    actor = FilmSerializer(read_only=True, many=True,)
    director = FilmSerializer(read_only=True, many=True,)

    class Meta:
        model = Celebrity
        fields = '__all__'

您还必须确保为 related_name 提供的值不与您在代码中使用的其他名称冲突。例如,如果您将它设置为 related_name = Film,它可能会导致问题。