相关疑难解决方法(0)

Django休息框架,在同一个ModelViewSet中使用不同的序列化器

我想提供两种不同的序列化器,但能够从以下所有设施中受益ModelViewSet:

  • 在查看对象列表时,我希望每个对象都有一个重定向到其详细信息的URL,并且使用__unicode __目标模型显示每个其他关系;

例:

{
  "url": "http://127.0.0.1:8000/database/gruppi/2/",
  "nome": "universitari",
  "descrizione": "unitn!",
  "creatore": "emilio",
  "accesso": "CHI",
  "membri": [
    "emilio",
    "michele",
    "luisa",
    "ivan",
    "saverio"
  ]
}
Run Code Online (Sandbox Code Playgroud)
  • 查看对象的详细信息时,我想使用默认值 HyperlinkedModelSerializer

例:

{
  "url": "http://127.0.0.1:8000/database/gruppi/2/",
  "nome": "universitari",
  "descrizione": "unitn!",
  "creatore": "http://127.0.0.1:8000/database/utenti/3/",
  "accesso": "CHI",
  "membri": [
    "http://127.0.0.1:8000/database/utenti/3/",
    "http://127.0.0.1:8000/database/utenti/4/",
    "http://127.0.0.1:8000/database/utenti/5/",
    "http://127.0.0.1:8000/database/utenti/6/",
    "http://127.0.0.1:8000/database/utenti/7/"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我设法按照以下方式完成所有这些工作:

serializers.py

# serializer to use when showing a list
class ListaGruppi(serializers.HyperlinkedModelSerializer):
    membri = serializers.RelatedField(many = True)
    creatore = serializers.RelatedField(many = False)

    class Meta:
        model = models.Gruppi

# serializer …
Run Code Online (Sandbox Code Playgroud)

django serialization django-rest-framework

165
推荐指数
6
解决办法
6万
查看次数

Django Rest Framework:使用路由器注册基于纯函数的视图,以便它出现在 API 根目录下

这是我的views.py

class ChoicesViewSet(viewsets.ModelViewSet):
    queryset = SingleChoice.objects.all()
    serializer_class = SingleChoiceSerializer
    ...

class AssessmentTakersViewSet(viewsets.ModelViewSet):
    queryset = AssessmentTaker.objects.all()
    serializer_class = AssessmentTakersSerializer
    ...

@api_view(['POST'])
@parser_classes((JSONParser,))
def studio_create_view(request, format=None):
    """"
    A view that accept POST request with JSON content and in turn build out the 
    questions and choices. Post with application/json type.
    """
    ... 
Run Code Online (Sandbox Code Playgroud)

这是我的urls.py


urlpatterns = [
    # http://localhost:8000/survey/api/studio-create
    path('api/studio-create', views.studio_create_view, name='studio-create-api'),
]

# drf config
router = routers.DefaultRouter()

router.register('api/choices', views.ChoicesViewSet)
router.register('api/assessment-takers', views.AssessmentTakersViewSet)

urlpatterns += router.urls
Run Code Online (Sandbox Code Playgroud)

这在功能上有效,并且被认为是功能完整的,但由于studio-create_view未在路由器中注册,因此该路径不会显示在 API …

python django django-rest-framework

7
推荐指数
1
解决办法
1936
查看次数