Как я могу передать url `kwarg` в HyperlinkedIdentityField в структуре отдыха django? - PullRequest
0 голосов
/ 05 ноября 2018

My url_conf выглядит следующим образом,

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

Фирменная часть получается в сериализаторе через context.

Я мог бы создать HyperlinkedIdentityField, если бы у URL был pk kwarg, как указано в документах . Но с добавленным полем 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 голосов
/ 06 ноября 2018

Вам нужно настроить HyperlinkedIdentityField, чтобы обеспечить дополнительные kwargs:

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)
...