在声明

时间:2016-02-14 11:09:47

标签: python django forward-declaration

好的,所以使用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杀了我一段时间,但我终于碰到了一个实际上阻止我完成工作的实例。

2 个答案:

答案 0 :(得分:0)

这个问题听起来与StackOverflow上发布的其他Django前向声明问题非常相似。你可以使用this style of forward declaration?这样的东西你需要将owner成员包装在Django函数调用中,我不知道在这种情况下是否有适当的调用。此解决方案也特定于Django,而不是Python的本机功能。

答案 1 :(得分:0)

您可以改为提供一个包含类的(点符号)路径的字符串。

使用 DRF,您的文件夹结构可能如下所示:

├── appname
│   ├── ...
│   └── serializers.py
├── ...

SnippetSerializerUserSerializer 在上述 serializers.py 文件中声明。

然后您将使用字符串引用 UserSerializer"appname.serializers.UserSerializer",您通常会在其中写入 UserSerializer