我想使用HyperLinkedModelSerializer
来为我的Book
模型添加一个url
字段。以下是您通常在普通教程中找到的解决方案:
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
class Meta:
model = Book
fields = ("title", "url",)
# views.py
class BookView(RetrieveAPIView):
serializer_class = BookSerializer
# urls.py
urlpatterns = [
path("<pk>/", BookDetailView.as_view(), name="book-detail"),
]
这也没问题。但是现在我需要更改URL以匹配图书id,不是用<pk>
,而是用<fiction_id>
。所以我想我应该把它改了!
# urls.py
urlpatterns = [
path("<fiction_id>/", BookDetailView.as_view(), name="book-detail"),
]
现在飞机坠毁了:
django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "fiction-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
在我看来,我尝试过摆弄lookup_field
,lookup_url_kwargs
:
# views.py
class BookView(RetrieveAPIView):
serializer_class = BookSerializer
lookup_field = "pk"
lookup_url_kwargs = "fiction_id"
我试过提醒序列化程序实际查找(默认) "pk":
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
class Meta:
model = Book
fields = ("title", "url",)
extra_kwargs = {
"url": {"lookup_field": "pk"},
}
我试过这些组合,但没有用。看起来,如果你想利用<pk>
的url字段,除了HyperLinkedModelSerializer
之外,什么都不能用。文档似乎没有提供一种改变这种行为的方法:
默认情况下,超链接应该对应与样式“{model_name}-detail”匹配的视图名称,而则通过pk关键字参数查找实例。
我怎样才能改变这种行为,或者它一定会变得太混乱?
发布于 2021-02-03 23:54:08
您应该检查HyperlinkedModelSerializer
实现,并确保它使用serializer_related_field
默认值为HyperlinkedRelatedField
。
class HyperlinkedModelSerializer(ModelSerializer):
"""
A type of `ModelSerializer` that uses hyperlinked relationships instead
of primary key relationships. Specifically:
* A 'url' field is included instead of the 'id' field.
* Relationships to other instances are hyperlinks, instead of primary keys.
"""
serializer_related_field = HyperlinkedRelatedField
...
然后HyperlinkedRelatedField
有一个类属性lookup_field
默认为pk
class HyperlinkedRelatedField(RelatedField):
lookup_field = 'pk'
...
您可以做的是在您自己的HyperlinkedRelatedField
中使用自定义lookup_field
。
from rest_framework.relations import HyperlinkedRelatedField
from rest_framework.serializers import HyperlinkedModelSerializer
class BookHyperlinkedRelatedField(HyperlinkedRelatedField):
lookup_field = 'fiction_id'
class BookSerializer(HyperLinkedModelSerializer):
serializer_related_field = BookHyperlinkedRelatedField
class Meta:
model = Book
fields = ("title", "url",)
发布于 2021-02-04 08:02:59
为此,需要通过extra_kwargs
字典传递url字段在匹配模式中查找的新名称:
# serializers.py
class BookSerializer(HyperLinkedModelSerializer):
class Meta:
model = Book
fields = ("title", "url",)
extra_kwargs = {
"url": {"lookup_url_kwarg": "fiction_id"},
}
还记得修改相应的视图:
# views.py
class BookView(RetrieveAPIView):
serializer_class = BookSerializer
lookup_url_kwarg = "fiction_id"
不要用复数形式写lookup_url_kwargs
。只要在模型的主键上进行查找,就不需要在任何级别上干预lookup_field
。
https://stackoverflow.com/questions/66034534
复制