graphene-django icon indicating copy to clipboard operation
graphene-django copied to clipboard

Support Django 5 GeneratedField

Open KianChavoshiNejad opened this issue 2 years ago • 2 comments

Note: for support questions, please use stackoverflow. This repository's issues are reserved for feature requests and bug reports.

  • What is the current behavior?

I used Django 5's GenerativeField to define one of my fields

quantity = models.PositiveIntegerField()

unit_price = models.DecimalField(
        max_digits=12,
        decimal_places=2,
        null=True,
        blank=True,
    )

total_price = models.GeneratedField(
        expression=models.F("quantity") * models.F("unit_price"),
        output_field=models.DecimalField(
            max_digits=12,
            decimal_places=2,
        ),
        db_persist=True,
        null=True,
        blank=True,
    )

When I try to pass the value through the DjangoObjectType, I received the following error:

Exception: Don't know how to convert the Django field ModelName.total_price (<class 'django.db.models.fields.generated.GeneratedField'>)

  • If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via a github repo, https://repl.it or similar (you can use this template as a starting point: https://repl.it/@jkimbo/Graphene-Django-Example).
  1. Create a model with a GeneratedField
  2. Create a DjangoObjectType for the model created in step 1
  3. Error will appear when trying to query the generated field in GraphQL
  • What is the expected behavior? The expected behavior is for DjangoObjectType to use the output_field type defined in the GeneratedField.

  • What is the motivation / use case for changing the behavior? We would like to leverage the new GeneratedField functionality in Django 5.

  • Please tell us about your environment:

    • Version: 14,2,1
    • Platform: macOS Sonoma
    • Django_version = 5.0.1 -Graphene_version = 3.3
  • Other information (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow)

KianChavoshiNejad avatar Jan 26 '24 16:01 KianChavoshiNejad

Also running into a use case for this in a project I'm working on

cmhac avatar Jul 11 '24 21:07 cmhac

I don't know what I'm doing, but the following code worked for me

from django.contrib.gis.db import models

from graphene_django.converter import convert_django_field


@convert_django_field.register(models.GeneratedField)
def convert_generated_field(field, registry=None):
    convert_django_field.dispatch(field.output_field.__class__)

andrewcole avatar Aug 30 '24 14:08 andrewcole