如何在Django Rest Framework中为`HyperlinkedIdentityField`正确设置`lookup_field`?

时间:2019-12-05 13:25:02

标签: django django-rest-framework

我需要更改默认的HyperlinkedModelSerializer网址。根据文档,我必须像这样手动定义url字段:

serializers.py

class StockSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='stock-detail', lookup_field='unique_id')

    class Meta:
        model = Stock
        fields = ['id', 'url', 'symbol', 'unique_id', 'other_details']

或像这样使用extra_kwargs

serializers.py

class StockSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Stock
        fields = ['id', 'url', 'symbol', 'unique_id', 'other_details']
        extra_kwargs = {
            'url': {'view_name': 'stock-detail', 'lookup_field': 'unique_id'}
        }

但是他们都不为我工作。错误是:

django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "stock-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

这是我的views.py

class StockViewSet(ModelViewSet):
    queryset = Stock.objects.all()
    serializer_class = StockSerializer

如果我将lookup_field更改为pk(在serializers.py中),它可以正常工作而不会出现任何错误,但是url不是我想要的。那么如何正确设置lookup_field

1 个答案:

答案 0 :(得分:0)

临时解决了该问题,方法是将unique_id中的models.py字段更改为primary_key=True,以便HyperlinkedModelSerializer自动使用unique_id创建URL。

但是问题仍然存在:如何使HyperlinkedModelSerializer使用pk以外的其他字段来创建网址?

编辑:通过向lookup_field = 'unique_id'views.py添加serializers.py来永久解决此问题。