假设我有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访问这些属性。
现在我用完了想法。有没有办法达到预期的行为?
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)
并且两个属性都按预期工作。