Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for source with attributes in extra_kwargs of ModelSerializer #9077

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

BergLucas
Copy link

refs #4688

Description

Hello dear maintainers, it's my first contribution to django rest framework so I hope I didn't do anything wrong.

In the pull request referenced above, there is someone that mentioned that we could not use source with attributes in extra_kwargs of a ModelSerializer.

For example, the following code would create an error:

class MyUser(models.Model):

    user = models.OneToOneField(User, on_delete=models.DO_NOTHING)

class MyUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyUser
        fields = (
            "username",
        )
        extra_kwargs = {
            "username": {"source": "user.username"},
        }

I think it could be a very interesting feature because at the moment, when we have a foreign key to another model, we're obliged to specify the fields explicitly in the serializer. However, this means that if we have special validators on the fields of our model, we're obliged to put them back on the serializer fields.

For example, the username field of Django's default User has a special validator so if we just define a basic CharField, it would not validate the data the same way as the model would validate it:

class MyUser(models.Model):

    user = models.OneToOneField(User, on_delete=models.DO_NOTHING)

class MyUserSerializer(serializers.ModelSerializer):

    username = serializers.CharField(source="user.username")

    class Meta:
        model = MyUser
        fields = (
            "username",
        )

This could create a difference between the way the model validates data and the way the serializer validates data if we forgot a validator or if we change the model without changing the serializer.

In this pull request, I added this feature so that we could just specify the model field we want in the source of extra_kwargs and it will generate the right field on the serializer.

The code may seem a little odd, but I've tried to keep the changes in one place only. I've also tried to maintain a good error message so that, if at any point the path to the field is wrong, it returns the full path in the error message and not just part of it.

Thanks for reading and please let me know if there are any changes that could be made.

@auvipy auvipy self-requested a review August 19, 2023 15:05
Copy link
Member

@auvipy auvipy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you please add proper test cases to validate the changes proposed?

@auvipy auvipy requested review from auvipy and a team August 23, 2023 14:25
tests/test_model_serializer.py Outdated Show resolved Hide resolved
tests/test_model_serializer.py Outdated Show resolved Hide resolved
@auvipy
Copy link
Member

auvipy commented Sep 14, 2023

___________________________________ summary ____________________________________
ERROR: py36-django30: commands failed
py36-django31: commands succeeded
py36-django32: commands succeeded

Copy link
Member

@auvipy auvipy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that was a nice example

@auvipy auvipy added this to the 3.15 milestone Sep 14, 2023
Copy link
Member

@auvipy auvipy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this should also require documentation update as far as I can understand!

@BergLucas BergLucas force-pushed the improvement/source-attributes-in-extra_kwargs branch from b10dfc2 to c1ccc37 Compare September 14, 2023 15:36
@BergLucas
Copy link
Author

Hi @auvipy,

And this should also require documentation update as far as I can understand!

Do you mean to add a section here (or elsewhere) to document the feature?

@auvipy
Copy link
Member

auvipy commented Oct 2, 2023

Hi @auvipy,

And this should also require documentation update as far as I can understand!

Do you mean to add a section here (or elsewhere) to document the feature?

yup there or somewhere else where it would be relevant

@auvipy auvipy requested a review from a team October 2, 2023 05:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants