Is There A Way To Get Graphene To Work With Django Genericrelation Field?
I have some django model generic relation fields that I want to appear in graphql queries. Does graphene support Generic types? class Attachment(models.Model): user = models.Fo
Solution 1:
You need to expose Attachment
to your schema. Graphene needs a type
to work with for any related fields, so they need to be exposed as well.
In addition, you're likely going to want to resolve related attachments
, so you'll want to add a resolver for them.
In your graphene classes, try:
classAttachmentType(DjangoObjectType):
classMeta:
model = AttachmentclassApartoType(DjangoObjectType):
classMeta:
model = Aparto
attachments = graphene.List(AttachmentType)
def resolve_attachments(root, info):
return root.attachments.all()
Solution 2:
It's not perfect, but this is how I did it:
First create a proxy class (I found that abstract = True
also works), this should have all the fields that all the possible Generically Related objects can have.
classCatchAll(RelatedModelYouInheritFrom):
class Meta:
proxy = True
Then make a type for the proxy model
classCatchAllType(DjangoObjectType):
classMeta:
model = CatchAllfields= ('some_var', 'other_var')
and in the resolver that returns instances of multiple classes: cast the instance as a CatchAll:
classModelWithGenericForeignKeyType(DjangoObjectType):classMeta:
model = ModelWithGenericForeignKey
fields = ('other_var', 'some_var')
generic_relation = graphene.Field(CatchAllType)
defresolve_generic_relation(self, info, **kwargs):
d = self.generic_relation.__dict__ # turn the model in a dict
d.pop('_state') # remove the statereturn CatchAll(**d) # cast the object of any class into the CatchAll
Post a Comment for "Is There A Way To Get Graphene To Work With Django Genericrelation Field?"