Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    file = models.FileField(upload_to=user_directory_path)
class Aparto(models.Model):
    agency = models.CharField(max_length=100, default='Default')
    features = models.TextField()
    attachments = GenericRelation(Attachment)

graphene classes:

class ApartoType(DjangoObjectType):
    class Meta:
        model = Aparto
class Query(graphene.ObjectType):
    all  = graphene.List(ApartoType)
    def resolve_all(self, info, **kwargs):
        return Aparto.objects.all()

schema = graphene.Schema(query=Query)

I expect the attachments field to appear in the graphql queries results. Only agency and features are showing.

like image 394
Vincent J. Michuki Avatar asked Oct 14 '25 02:10

Vincent J. Michuki


1 Answers

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:

class AttachmentType(DjangoObjectType):
    class Meta:
        model = Attachment

class ApartoType(DjangoObjectType):
    class Meta:
        model = Aparto

    attachments = graphene.List(AttachmentType)
    def resolve_attachments(root, info):
        return root.attachments.all()
like image 113
Chris Larson Avatar answered Oct 17 '25 00:10

Chris Larson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!