django rest-farmework嵌套关系传递参数

时间:2017-02-19 16:25:08

标签: python django django-rest-framework serializer django-serializer

使用django rest-farmework实现API,有一个问题一直无法解决:如何通过view.py将参数传递给serializers.py?具体代码如下:

models.py

class Category(models.Model):
    name = models.CharField(max_length=30)
    amount = models.IntegerField()

class Source(models.Model):
    name = models.CharField(max_length=50)
    rss_link = models.URLField()
    amount = models.IntegerField()
    # ForeignKey
    category = models.ForeignKey(Category)

views.py

class CategoryListView(APIView):
    def get(self, request):
        # How should this variable be passed to serializers.py?
        num_parameter = request.GET.get("num")

        category = Category.objects.all()
        serializers = CategorySerializers(category, many=True)
        return Response(serializers.data)

serializers.py

class SourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Source
        fields = ("id","name","amount")

class CategorySerializer(serializers.ModelSerializer):
    source_set = serializers.SerializerMethodField('get_sources')

    def get_sources(self, category):
        sources = category.source_set.filter(amount=0)
        # I expect the code as follows,the "num_parameter" from views.py
        # sources = category.source_set.filter(amount=num_parameter)

        return SourceSerializer(instance=sources, many=True).data

    class Meta:
        model = Category
        fields = ("id", "name", "amount", "source_set")

程序运行结果:

[
    {
        "id": 1,
        "name": "study",
        "amount": "0",
        "source": [
            {
                "id": 34,
                "name": "java",
                "amount": "0"
            },
            {
                "id": 35,
                "name": "python",
                "amount": "0"
            }
        ]
    }
]

作为注释,修改了以下代码:

sources = category.source_set.filter(amount=0)

sources = category.source_set.filter(amount=num_parameter)

“num_parameter”来自“CategoryListView”,如何将其传递给“CategorySerializer”?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以访问序列化程序上下文:

def get_sources(self, category):
    num_parameter = self.context['request'].query_params['num']
    sources = category.source_set.filter(amount=num_parameter)

在您的情况下,您需要在实例化序列化程序时传递上下文:

CategorySerializers(category, many=True, context={'request': request})

这通常在使用通用GenericAPIViews时自动完成。