在声明类之前引用python中的类
好的,使用Django REST框架教程中的直接示例,我有两个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中使用“UserSerializer”作为序列化程序,但出于某些原因,需要首先声明SnippetSerializer。代码示例:在声明类之前引用python中的类,python,django,forward-declaration,Python,Django,Forward Declaration,好的,使用Django REST框架教程中的直接示例,我有两个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中使用“UserSerializer”作为序列化程序,但出于某些原因,需要首先声明SnippetSerializer。代码示例: class SnippetSerializer(serializers.HyperlinkedModelSerializer): owner = UserSerializer()
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中已经折磨了我一段时间,但我终于遇到了一个实例,它实际上阻止了我完成工作。这个问题听起来与StackOverflow上发布的其他Django forward声明问题非常相似。您是否可以使用类似于需要在Django函数调用中包装
owner
成员的东西,我不知道在这种情况下是否有合适的调用。此解决方案也是Django特有的,而不是Python的本机功能。您可以提供一个包含类的(点表示法)路径的字符串
使用DRF,您可能有如下文件夹结构:
├── appname
│ ├── ...
│ └── serializers.py
├── ...
SnippetSerializer
和UserSerializer
在上述serializers.py
文件中声明
然后使用字符串引用
UserSerializer
:appname.serializers.UserSerializer通常在哪里编写UserSerializer
程序启动后是否声明类?通常,您会在运行程序之前声明类/函数。我对Django非常了解,但经典的方法是在SnippetSerializer之前声明UserSerializerBase,然后从中继承UserSerializer。这就是Python,您当然可以在事实发生后更改实际的类定义,从而在SnippetSerializer之前声明UserSerializer,然后在以后修改它。@user-是的,但由于django是一种没有头的解释语言,它不做像javascript这样的语言所做的前向读取工作,在代码到达其声明之前,您不能引用另一个类。@deets-我明白您的意思,该方法可以工作,但不能完全工作,因为Djangos嵌套类的内容没有相互继承。这是个好主意,不过我以后会记住的。另外,出于好奇,我最近才开始在这个网站上进行互动。为什么人们经常发表评论,而不是给出一个可以被正确投票/接受的答案?通常评论是为了人们猜测工作或者“你试过了吗?”。答案是100%肯定这会起作用。