Rest Framework - 过滤外键结果

时间:2016-04-13 08:01:17

标签: django django-models django-rest-framework

我在Django中有以下模型,我正在尝试执行一个过滤器,以便只有一个外键值作为结果集的一部分返回。

class Document(models.Model):
    name = models.CharField(...)
    version = models.ForeignKey(Version)

class Version(models.Model):
    num = models.IntegerField()

我的序列化器看起来像这样。

class VersionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Version
        fields = (...)

class DocumentVersionSerializer(serializers.ModelSerializer):
    version = VersionSerializer(source='version_set', many=True, read_only=True)

    class Meta:
        model = Document
        fields = (...)

My RetrieveAPIView看起来像这样:

class Search(ListAPIView):
    queryset = Document.objects.all().distinct()
    serializer_class = DocumentVersionSerializer

    def filter_queryset(self, queryset):
        queryset = super(Search, self).filter_queryset(queryset)
        queryset.filter(version__num=self.kwargs.get('version_num))
        return queryset

我所需要的是以下内容,一个带有1个版本的Document对象,该对象被设置为URL的一部分。因此,URL可能类似于:/api/document/version/1.1/

json会是这样的:

{
    "name": "test document",
    "version": {
        "num": "1.1",
    },
}

但我明白了:

{
    "name": "test document",
    "version": [
        {
            "num": "1.1",
        },
        {
            "num": "1.2",
        },
    ]
}

我遇到的问题是json响应中会出现多个版本号。如何限制返回的回复数量。

1 个答案:

答案 0 :(得分:0)

我认为你可以使用serializers.SerializerMethodField()

来做到这一点
class VersionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Version
        fields = (...)

class DocumentVersionSerializer(serializers.ModelSerializer):
    version = serializers.SerializerMethodField()

    def get_version(self, Document):
            #select the one version that you want through queryset
            #and then serialize it with your VersionSerializer.

    class Meta:
        model = Document
        fields = (...)

不要忘记在字段中列出“版本”。 您可以在此处找到此方法的文档:http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield