【问题标题】:Self-referencing class variable in PythonPython中的自引用类变量
【发布时间】:2017-05-27 14:56:00
【问题描述】:

我正在尝试在 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

失败,因为我不能在自己的类定义中引用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 添加什么时只看到属于声明一部分的类变量。有什么想法吗?

【问题讨论】:

    标签: python django graphene-python


    【解决方案1】:

    基于https://github.com/graphql-python/graphene/issues/110,正确的方法是使用字符串:

    class FolderNode(DjangoObjectType):
        folders = graphene.List('FolderNode')
    

    【讨论】:

      【解决方案2】:

      一个想法:定义一个在类创建时不考虑的属性怎么样,如下

      class FolderNode(DjangoObjectType):
          @property
          def folders(self):
              return graphene.List(FolderNode)
      

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多