gpt4 book ai didi

Django REST 框架 : Two different ModelSerializers for the same model

转载 作者:行者123 更新时间:2023-12-04 17:34:49 27 4
gpt4 key购买 nike

我有一个模型,我为它定义了两个不同的 HyperlinkedModelSerializers:

class Foo(models.Model):
...

class FooSerializer1(serializers.HyperlinkedModelSerializer):
...

class Meta:
model = Foo
fields = ('url', 'id', ...)
lookup_field= 'pk'

# A second view of the same model for another API use-case
class FooSerializer2(serializers.HyperlinkedModelSerializer):
...

class Meta:
model = Foo
fields = ('url', 'id', ...)
lookup_field= 'pk'
FooSerializer1正在被一对夫妇使用 GenericViews在一个 Django 应用程序(即它自己的 urls.py)中,和 FooSerializer2来自 ModelViewSet在另一个 Django 应用程序中。我有 ModelViewSetDefaultRouter 注册以及其他一些 View 集:
urlpatterns = patterns('',
url(r'^$', 'myapp.views.api_root'),
url(r'^foo1/$', views.FooList1.as_view(), name='foo1-list'),
...
)

urlpatterns = format_suffix_patterns(urlpatterns)

...

class FooViewSet2(viewsets.ReadOnlyModelViewSet):
queryset = Foo.objects.all()
serializer_class = FooSerializer2
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

def get_queryset(self):
...

router = routers.DefaultRouter()
...
router.register(r'foo2', views.FooViewSet2)
...
urlpatterns = router.urls

该路由器的自动生成的 api 根显示 GenericView 的端点的 FooSerializer1 ( foo1-list ),而不是 foo2/ .如果我手动获取 foo2/ ,结果显示 Foo根据 FooSerializer2 序列化(这是正确的),但是每个结果的 URL 再次显示 foo1详细 View 。

我试过设置 get_serializerFooViewSet2 ,但这没有用。我如何获得 api-root 和 FooSerializer2结果显示 FooViewset2对应的URL ?

最佳答案

幸运的是,DRF 允许通过设置几个参数灵活地支持这种情况。

首先,我设置了basename路由器条目上的参数:

router.register(r'foo2', views.Foo2ViewSet, 'foo2')

接下来,我设置了 view_nameHyperlinkedModelSerializers为了不默认为 foo-detailmentioned in the docs :
class FooSerializer1(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='foo1-detail',
)
...

urlpatterns = patterns('',
url(r'^$', 'myapp.views.api_root'),
url(r'^foo1/$', views.Foo1List.as_view(), name='foo1-list'),
url(r'^foo1/(?P<pk>[0-9]+)/$', views.FooDetail1.as_view(), name='foo1-detail'),

...

class FooSerializer2(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='foo2-detail',
)
...

关于Django REST 框架 : Two different ModelSerializers for the same model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351287/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com