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

时间:2019-04-06 13:57:10

标签: python django graphql graphene-python

说我有如下所示的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()添加属性。这样的破解肯定会​​设置属性,以使类具有完全相同的结构,但这似乎为时已晚:根本无法从GraphQL访问这些属性。

现在,我的想法耗尽了。有什么方法可以实现所需的行为?

1 个答案:

答案 0 :(得分: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)

,并且两个属性都可以正常工作。