我看到我可以在运行时轻松修改Serializer的Meta选项(我甚至不确定这是调用它的正确方法,我读到有人称之为猴子修补,即使我不喜欢它):
NodeDetailSerializer.Meta.fields.append('somefield')
如果我需要做以下事情该怎么办?
NodeDetailSerializer.contact = serializers.HyperlinkedIdentityField(view_name='api_node_contact', slug_field='slug')
NodeDetailSerializer.Meta.fields.append('contact')
为什么我需要这样做? 我正在尝试构建一个模块化应用程序,我有一些可选的应用程序可以添加到它们自动添加一些功能到核心应用程序。 我想将两个应用程序的代码分开,也因为其他应用程序可能会在不同的存储库中移动。
编写模块化和可扩展的应用程序确实是一件非常棘手的事情。 如果有人有一些有用的资源可以分享,那么想了解更多。
费德里科
答案 0 :(得分:3)
我找到了解决问题的方法。
我的问题是:我需要能够在不编辑核心应用程序代码的情况下将超链接添加到其他资源。我需要从附加模块的代码中完成它。
我写了这个序列化器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'
})