在石墨烯-django中使循环依赖的模型属性可查询

问题描述 投票:0回答:1

假设我有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)

但是,此代码不起作用,因为ProjectType类中的UserType未定义,并且交换这些类将无济于事。

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

现在我用完了想法。有没有办法达到预期的行为?

python django graphql graphene-python
1个回答
0
投票

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)

并且两个属性都按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.