python - 使循环依赖模型属性在 graphene-django 中可查询

标签 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)

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

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

现在我已经没有主意了。有什么方法可以实现所需的行为吗?

最佳答案

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)

这两个属性都可以按需要工作。

关于python - 使循环依赖模型属性在 graphene-django 中可查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55549779/

相关文章:

python - 如何在 Python 中着色用户输入?

python - uWSGI 共享内存的最小示例?

laravel - artisan是否缓存:clear also remove lighthouse cache?

Python-socket.error : Cannot assign requested address

Python:这是比较和排序字符串列表的低效方法吗?

python - 如何在 tkinter 中使用文本框并使用值? python 3

django - 查询集引发 : Related Field got invalid lookup: icontains

python - 具有隐藏所有网站页面的登录名和密码的 Django 中间件

graphql - 是否可以在 GraphQL 查询中使用嵌套/命名空间查询变量?

postgresql - 如何在 prisma 中将 createMany 与外键一起使用?