如何在Django Rest框架中将URL`kwarg`传递给HyperlinkedIdentityField?

时间:2018-11-05 19:53:40

标签: django django-rest-framework serializer

我的url_conf如下所示,

...appointments/<slug:company>/ ^service_booking/(?P<pk>[^/.]+)/$ 

公司零件是通过context在序列化程序中获得的。

如果URL仅具有docs中所述的HyperlinkedIdentityField kwarg,我本可以创建一个pk。但是添加了company字段后,我无法做到这一点。

当前,我正在使用SerializerMethodField来按以下方式处理此问题:

def get_url(self, obj):
return self.context['request'].build_absolute_uri(
        reverse('appointment:service-booking',
                kwargs=dict(company=self.context['company'].id,
                            pk=obj.pk)
                )
    )

我相信HyperlinkedIdentityField在实际传递给序列化程序之前将无法访问上下文。

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

您必须自定义HyperlinkedIdentityField才能提供额外的缺点:

class MyHyperlinkedIdentityField(HyperlinkedIdentityField):
    def get_url(self, obj, view_name, request, format):
        if hasattr(obj, 'pk') and obj.pk in (None, ''):
            return None

        lookup_value = getattr(obj, self.lookup_field)
        kwargs = {
            self.lookup_url_kwarg: lookup_value,
            'company': self.context['company'].id,
        }
        return self.reverse(view_name, kwargs=kwargs, request=request, format=format)