【问题标题】:`HyperlinkedIdentityField` requires the request in the serializer context`HyperlinkedIdentityField` 需要序列化程序上下文中的请求
【发布时间】:2018-09-06 17:27:57
【问题描述】:

我已经尝试了所有我能做的,但没有什么对我有用

我的模型:

model Parent():
    ...
model Child():
    owner = models.ForeignKey(Parent, on_delete=models.CASCADE,
                          related_name='children')
    ...

我的网址:

router = routers.DefaultRouter()
router.register(r'parents', ParentViewSet, base_name="parents")
router.register(r'childs', ChildViewSet, base_name="childs")

urlpatterns = [
    path('api/', include(router.urls)),
]

我的序列化器:

class ParentSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="parent-detail", lookup_field='pk')
    children = serializers.SerializerMethodField()
    class Meta:
        model = User
        fields = (
            ...
            'children')

    def get_children(self, obj):
        queryset = Child.objects.filter(owner=obj)
        children = ChildSerializer(queryset, many=True).data
        return children

class ChildSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="child-detail", lookup_field='pk')
    ...

我的视图集:

class ParentViewSet(SerializerByActionMixin, LoggingMixin, viewsets.ModelViewSet):

queryset = Parent.objects.all().prefetch_related('children').order_by('-date_joined')
serializers = {
    'default': ParentSerializer,
    'create': ParentCreateSerializer,
    'update': ParentUpdateSerializer,
}

class ChildViewSet(LoggingMixin, viewsets.ModelViewSet):

queryset = Child.objects.all().order_by('-timestamp')
serializer_class = ChildSerializer
http_method_names = ['get', 'put', 'patch', 'head']

我的问题: HyperlinkedIdentityField 需要序列化程序上下文中的请求。实例化序列化器时添加context={'request': request}。 我读了这个,但不明白我的代码在哪里粘贴这个上下文。 请帮忙。谢谢!

【问题讨论】:

    标签: nested django-rest-framework serialization


    【解决方案1】:

    如文档所述,您将需要上下文中的请求:

    class ParentSerializer(serializers.ModelSerializer):
        ...
        def get_children(self, obj):
            queryset = Child.objects.filter(owner=obj)
            children = ChildSerializer(queryset, many=True, context=self.context).data
            return children
    

    【讨论】:

    • 我是如此接近,试图传递这个参数,但事实并非如此))我只是没有言语......决定......感谢你的普遍性!
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2015-12-20
    • 2013-06-26
    • 2015-09-11
    • 1970-01-01
    • 2010-10-29
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多