【问题标题】:Rest Framework - filter foreign key resultsRest Framework - 过滤外键结果
【发布时间】:2016-04-13 08:01:17
【问题描述】:

我在 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 = (...)

我的 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 响应中返回。如何限制返回响应的数量。

【问题讨论】:

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


    【解决方案1】:

    我认为你可以使用 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

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2013-10-24
      • 2018-08-18
      相关资源
      最近更新 更多