【发布时间】:2016-05-25 06:45:32
【问题描述】:
我正在使用 Django REST 框架教程中的直接示例,我有 2 个类:UserSerializer 和 SnippetSerializer。我希望能够在SnippetSerializer 类声明中使用UserSerializer 作为序列化程序,但出于某种原因,需要先声明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 中已经让我死了一段时间,但我终于遇到了一个实例,它实际上阻止了我完成工作。
【问题讨论】:
-
你是在程序启动后声明类吗?通常你会在运行程序之前声明类/函数。
-
我对 Django 有一定的了解,但经典的方法是在 SnippetSerializer 之前声明 UserSerializerBase,然后从中继承 UserSerializer。而这是 Python,当然可以在事后更改实际的类定义,从而在 SnippetSerializer 之前声明 UserSerializer,然后再进行修改。
-
@user - 是的,但是由于 django 是一种没有标题的解释性语言,并且它不会像 javascript 这样的语言那样做前向阅读,所以在代码到达之前你不能引用另一个类它的声明。
-
@deets - 我明白你在说什么,并且该方法有点工作,但不完全,因为 Django 嵌套类的东西没有相互继承。这是个好主意,但我以后会记住的。另外,好奇,我最近才真正在这个网站上进行互动。为什么人们如此频繁地发表评论,而不是给出一个可以适当赞成/接受的答案?
-
通常 cmets 用于人们的猜测工作或类似“你试过这个吗?”。答案是 100% 确定这会奏效。
标签: python django forward-declaration