Python 中的自引用 class 变量
Self-referencing class variable in Python
我正在尝试在 Graphene-Django 中实现类似文件夹的类型。文件夹可以包含文件或文件夹。这样做:
Django 模型:
from django.db import models
class Folder(models.Model):
name = models.CharField(...)
parent = models.ForeignKey('self')
class File(models.Model):
name = models.CharField(...)
content = models.TextField(...)
石墨烯API:
from files.models import Folder, File
class FolderNode(DjangoObjectType):
folders = graphene.List(FolderNode)
def resolve_folders(self, args, context, info):
return Folder.objects.filter(parent=self)
class Meta:
model = Folder
失败,因为我无法在其自己的 class 定义中引用 FolderNode
。将答案应用于 another question:
class FolderNode(DjangoObjectType):
def __new__(cls, *args, **kwargs):
cls.folders = graphene.List(cls)
return object.__new__(cls, *args, **kwargs)
def resolve_folders(self, args, context, info):
return Folder.objects.filter(parent=self)
class Meta:
model = Folder
也不起作用,因为 Graphene 在决定向 API 添加什么时,只会看到属于声明一部分的 class 变量。有什么想法吗?
一个想法:定义一个在class创建时没有考虑的属性怎么样,如下
class FolderNode(DjangoObjectType):
@property
def folders(self):
return graphene.List(FolderNode)
基于https://github.com/graphql-python/graphene/issues/110,正确的做法是使用字符串:
class FolderNode(DjangoObjectType):
folders = graphene.List('FolderNode')
我正在尝试在 Graphene-Django 中实现类似文件夹的类型。文件夹可以包含文件或文件夹。这样做:
Django 模型:
from django.db import models
class Folder(models.Model):
name = models.CharField(...)
parent = models.ForeignKey('self')
class File(models.Model):
name = models.CharField(...)
content = models.TextField(...)
石墨烯API:
from files.models import Folder, File
class FolderNode(DjangoObjectType):
folders = graphene.List(FolderNode)
def resolve_folders(self, args, context, info):
return Folder.objects.filter(parent=self)
class Meta:
model = Folder
失败,因为我无法在其自己的 class 定义中引用 FolderNode
。将答案应用于 another question:
class FolderNode(DjangoObjectType):
def __new__(cls, *args, **kwargs):
cls.folders = graphene.List(cls)
return object.__new__(cls, *args, **kwargs)
def resolve_folders(self, args, context, info):
return Folder.objects.filter(parent=self)
class Meta:
model = Folder
也不起作用,因为 Graphene 在决定向 API 添加什么时,只会看到属于声明一部分的 class 变量。有什么想法吗?
一个想法:定义一个在class创建时没有考虑的属性怎么样,如下
class FolderNode(DjangoObjectType):
@property
def folders(self):
return graphene.List(FolderNode)
基于https://github.com/graphql-python/graphene/issues/110,正确的做法是使用字符串:
class FolderNode(DjangoObjectType):
folders = graphene.List('FolderNode')