Support Django 5 GeneratedField
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).
- Create a model with a
GeneratedField - Create a
DjangoObjectTypefor the model created in step 1 - Error will appear when trying to query the generated field in GraphQL
-
What is the expected behavior? The expected behavior is for
DjangoObjectTypeto use theoutput_fieldtype defined in the GeneratedField. -
What is the motivation / use case for changing the behavior? We would like to leverage the new
GeneratedFieldfunctionality 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)
Also running into a use case for this in a project I'm working on
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__)