【问题标题】:Make cyclically dependent model properties queriable in graphene-django在graphene-django中使循环相关的模型属性可查询
【发布时间】:2019-08-28 04:58:01
【问题描述】:

假设我的 Django 模型如下所示:

class User(Model):
    username = CharField(...)

    @property
    def projects(self):
        return # projects the user is assigned to

class Project(Model):
    name = CharField(...)

    @property
    def users(self):
        return # users assigned to the project

class Assignment(Model):
    user = ForeignKey(User)
    project = ForeignKey(Project)

(我故意没有为属性编写查询集以使代码更具可读性。)

我希望能够在 graphene-django 查询中看到这些属性。我的ModelType 类如下所示:

class UserType(DjangoObjectType):
    class Meta:
        model = User

    projects = List(ProjectType)


class ProjectType(DjangoObjectType):
    class Meta:
        model = Project

    users = List(UserType)

但是,此代码不起作用,因为 UserType 类中的 ProjectType 未定义,交换这些类并没有太大帮助。

我尝试完全不包含属性,在创建了所有ModelType 类之后,我尝试通过setattr() 添加属性。这样的 hack 肯定会设置属性,因此类具有完全相同的结构,但似乎为时已晚:根本无法从 GraphQL 访问属性。

现在我的想法已经用完了。有什么方法可以实现所需的行为?

【问题讨论】:

    标签: python django graphql graphene-python


    【解决方案1】:

    ModelType 类的属性仅在类被初始化时才重要。稍后添加字段的一种方法是直接将它们添加到它们所在的位置。解决办法:

    class UserType(DjangoObjectType):
        class Meta:
            model = User
    
    
    class ProjectType(DjangoObjectType):
        class Meta:
            model = Project
    
    UserType._meta.fields["projects"] = get_field_as(List(ProjectType), _as=Field)
    ProjectType._meta.fields["users"] = get_field_as(List(UserType), _as=Field)
    

    这两个属性都可以正常工作。

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 2017-08-15
      • 2021-09-24
      • 2023-03-27
      • 2018-09-13
      • 2020-04-10
      • 2020-05-19
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多