我看到我可以在运行时轻松修改 Serializer 的 Meta 选项(我什至不确定这是调用它的正确方法,我读到有人称它为猴子补丁,即使我不喜欢它):
NodeDetailSerializer.Meta.fields.append('somefield')
如果我需要执行以下操作怎么办:
NodeDetailSerializer.contact = serializers.HyperlinkedIdentityField(view_name='api_node_contact', slug_field='slug')
NodeDetailSerializer.Meta.fields.append('contact')
为什么我需要这样做?
我正在尝试构建一个模块化应用程序,我有一些可以添加的可选应用程序,它们会自动将一些功能添加到核心应用程序中。
我想将两个应用程序的代码分开,因为其他应用程序可能会移动到不同的存储库中。
编写模块化和可扩展的应用程序确实是一项棘手的工作。
如果有人有一些有用的资源可以分享,想知道更多。
费德里科
最佳答案
我找到了解决我的问题的方法。
我的问题是:我需要能够在不编辑核心应用程序代码的情况下添加指向其他资源的超链接。我需要从附加模块的代码中做到这一点。
我写了这个序列化程序 mixin:https://gist.github.com/nemesisdesign/8132696
可以这样使用:
from myapp.serializers import MyExtensibleSerializer
MyExtensibleSerializer.add_relationship(**{
'name': 'key_name',
'view_name': 'view_name_in_urls_py',
'lookup_field': 'arg_passed_to_to_view_name'
})
关于Django 休息框架 : is it possible to modify a Serializer class at runtime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18023297/