【问题标题】:Django REST framework HyperlinkedModelSerializerDjango REST 框架 HyperlinkedModelSerializer
【发布时间】:2018-03-01 11:19:51
【问题描述】:

我正在努力简化如何在我的 Djangp 应用程序的 API 中包含不同的模型。以前我把它设置在每个模型都有一个单独定义的 Viewset 和一个 Serializer 的位置。相反,我正在研究一种更通用的方法,我只需传入一个模型和相关字段的列表,并将自动添加到 API 中。我目前遇到的问题是定义 serializer_class:

from myapp import MyModel
from rest_framework.serializers import HyperlinkedModelSerializer
from rest_framework.viewsets import ModelViewSet

app_name = 'myapp'
fields = ('field1', 'field2', 'field3')
queryset = MyModel.objects.all()

# Problem is here
serializer_class = HyperlinkedModelSerializer(model=MyModel, fields=fields)
viewset = ModelViewSet(queryset=queryset, serializer_class=serializer_class)

# Then to register it all with the router:
self.register(app_name + '/' +  model.__name__, viewset)

我得到错误:

TypeError: __init__() got an unexpected keyword argument 'fields'

问题似乎在于,在 HyperlinkedModelSerializer 中,“模型”和“字段”通常被定义为 Meta 选项,因此以这种方式提供它们时似乎不接受它们。

有没有办法做到这一点?

谢谢。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可能会定义一个包含许多奇怪事物的特定初始化,或者使用 type 动态声明您的类:

    MyMeta = type(
        'Meta',
        [],
        {"model": MyModel, "fields": fields},
    )
    MyHyperlinkedModelSerializer = type(
        'MyHyperlinkedModelSerializer',
        (HyperlinkedModelSerializer,),
        {'Meta': MyMeta},
    )
    viewset = ModelViewSet(
        queryset=queryset,
        serializer_class= MyHyperlinkedModelSerializer,
    )
    

    【讨论】:

    • 第 3 行:NameError: name 'Meta' is not defined
    • 哎呀,忘了 Meta 类不继承任何东西。帖子已更新。
    • 嗯,我现在遇到的问题是当我尝试注册它时: self.register(app_name + '/' + model.__name__, viewset) 显示了很多错误,但我认为归结为:AttributeError:此方法仅适用于类,不适用于实例。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-11-09
    相关资源
    最近更新 更多