From abc252b5d9d3899d1bfe1cf02e0ff69490048fca Mon Sep 17 00:00:00 2001 From: Noam Kushinsky Date: Mon, 24 Nov 2025 15:18:30 +0200 Subject: [PATCH] Enable disallow_any_generics in mypy configuration. --- CHANGELOG.md | 3 +++ drf_writable_nested/mixins.py | 14 ++++++++------ drf_writable_nested/serializers.py | 8 ++++++-- mypy.ini | 5 ++++- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04c9e9d..2f34eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## Unreleased +* Make serializer classes generic (@noamkush) + ## 0.7.2 * Add support for Django 5.1, 5.2 and Python 3.13 (@browniebroke) * Drop support for end-of-life Python 3.8 (@browniebroke) diff --git a/drf_writable_nested/mixins.py b/drf_writable_nested/mixins.py index f40dd48..d8022db 100644 --- a/drf_writable_nested/mixins.py +++ b/drf_writable_nested/mixins.py @@ -1,19 +1,21 @@ # -*- coding: utf-8 -*- from collections import OrderedDict, defaultdict -from typing import List, Tuple +from typing import List, Tuple, TypeVar from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist -from django.db.models import ProtectedError, SET_NULL, SET_DEFAULT +from django.db.models import ProtectedError, SET_NULL, SET_DEFAULT, Model from django.db.models.fields.related import ForeignObjectRel, ManyToManyRel from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError from rest_framework.validators import UniqueValidator +_MT = TypeVar("_MT", bound=Model) -class BaseNestedModelSerializer(serializers.ModelSerializer): + +class BaseNestedModelSerializer(serializers.ModelSerializer[_MT]): def _extract_relations(self, validated_data): reverse_relations = OrderedDict() relations = OrderedDict() @@ -241,7 +243,7 @@ def _get_save_kwargs(self, field_name): return save_kwargs -class NestedCreateMixin(BaseNestedModelSerializer): +class NestedCreateMixin(BaseNestedModelSerializer[_MT]): """ Adds nested create feature """ @@ -262,7 +264,7 @@ def create(self, validated_data): return instance -class NestedUpdateMixin(BaseNestedModelSerializer): +class NestedUpdateMixin(BaseNestedModelSerializer[_MT]): """ Adds update nested feature """ @@ -362,7 +364,7 @@ def delete_reverse_relations_if_need(self, instance, reverse_relations): str(instance) for instance in instances])) -class UniqueFieldsMixin(serializers.ModelSerializer): +class UniqueFieldsMixin(serializers.ModelSerializer[_MT]): """ Moves `UniqueValidator`'s from the validation stage to the save stage. It solves the problem with nested validation for unique fields on update. diff --git a/drf_writable_nested/serializers.py b/drf_writable_nested/serializers.py index f00ce98..dd743e6 100644 --- a/drf_writable_nested/serializers.py +++ b/drf_writable_nested/serializers.py @@ -1,8 +1,12 @@ +from typing import TypeVar + +from django.db.models import Model from rest_framework import serializers from .mixins import NestedCreateMixin, NestedUpdateMixin +_MT = TypeVar("_MT", bound=Model) -class WritableNestedModelSerializer(NestedCreateMixin, NestedUpdateMixin, - serializers.ModelSerializer): +class WritableNestedModelSerializer(NestedCreateMixin[_MT], NestedUpdateMixin[_MT], + serializers.ModelSerializer[_MT]): pass diff --git a/mypy.ini b/mypy.ini index de287a1..d9a32b1 100644 --- a/mypy.ini +++ b/mypy.ini @@ -7,4 +7,7 @@ plugins = django_settings_module = "example.settings" [mypy-setuptools.*] -ignore_missing_imports = True \ No newline at end of file +ignore_missing_imports = True + +[mypy-drf_writable_nested.*] +disallow_any_generics = True