好的,所以使用Django REST框架教程中的直接示例,我有2个类:UserSerializer和SnippetSerializer。我希望能够使用" UserSerializer"作为SnippetSerializer类声明中的序列化程序,但由于某些原因,需要首先声明SnippetSerializer。代码示例:
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = UserSerializer()
#unimportant stuff
class UserSerializer(serializers.HyperlinkedModelSerializer):
#unimportant stuff - lets say we reference SnippetSerializer here
我想到的明显答案是前向声明,但是从我的所有研究中,我都无法在Python中找到它。
我认为可能有用的另一个解决方案,但没有(也许我做错了?)而是试图在init方法中声明这种关系
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
def __init__(self, *args, **kwargs):
self.owner = UserSerializer()
super(SnippetSerializer, self).__init__(*args, **kwargs)
但这似乎被框架完全忽略了。
我也试过使用@addto,但它似乎只适用于函数,而不适用于属性/属性
有解决这个问题的方法吗?这个鸡蛋前的课程问题一直在用Python杀了我一段时间,但我终于碰到了一个实际上阻止我完成工作的实例。
答案 0 :(得分:0)
这个问题听起来与StackOverflow上发布的其他Django前向声明问题非常相似。你可以使用this style of forward declaration?这样的东西你需要将owner
成员包装在Django函数调用中,我不知道在这种情况下是否有适当的调用。此解决方案也特定于Django,而不是Python的本机功能。
答案 1 :(得分:0)
您可以改为提供一个包含类的(点符号)路径的字符串。
使用 DRF,您的文件夹结构可能如下所示:
├── appname
│ ├── ...
│ └── serializers.py
├── ...
SnippetSerializer
和 UserSerializer
在上述 serializers.py
文件中声明。
然后您将使用字符串引用 UserSerializer
:"appname.serializers.UserSerializer"
,您通常会在其中写入 UserSerializer