【问题标题】:Django REST Framework: Two different ModelSerializers for the same modelDjango REST Framework:同一模型的两个不同的 ModelSerializer
【发布时间】:2014-06-22 12:36:15
【问题描述】:

我为一个模型定义了两个不同的 HyperlinkedModelSerializer:

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)中使用,FooSerializer2ModelViewSet 在另一个 Django 应用程序中使用。我在 DefaultRouter 中注册了 ModelViewSet 以及其他一些视图集:

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/。如果我手动 GET foo2/,结果显示 Foo 根据 FooSerializer2 序列化(这是正确的),但是每个结果的 URL 再次显示 foo1 详细视图。

我尝试在FooViewSet2 中设置get_serializer,但这不起作用。如何获取 api-root 和 FooSerializer2 的结果以显示与 FooViewset2 对应的 URL?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    首先,我在路由器入口设置basename参数:

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

    接下来,我在HyperlinkedModelSerializers 中设置view_name,以便不将foo-detail 默认为mentioned 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',
        )
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2017-03-21
      • 2019-05-10
      • 2020-08-15
      • 2014-01-09
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多