Skip to content

Commit 3b546a5

Browse files
committed
Move ModelBase.objects declaration to Model.objects, for mypy 1.5.0
mypy 1.5.0 was fixed to understand that metaclass attributes take precedence over attributes in the regular class. So we need to declare `objects` in the regular class to allow it to be overridden in subclasses. Fixes #1648. Signed-off-by: Anders Kaseorg <[email protected]>
1 parent 325006c commit 3b546a5

File tree

4 files changed

+9
-12
lines changed

4 files changed

+9
-12
lines changed

django-stubs/db/models/base.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ class ModelState:
1919
fields_cache: ModelStateFieldsCacheDescriptor
2020

2121
class ModelBase(type):
22-
@property
23-
def objects(cls: type[_Self]) -> BaseManager[_Self]: ... # type: ignore[misc]
2422
@property
2523
def _default_manager(cls: type[_Self]) -> BaseManager[_Self]: ... # type: ignore[misc]
2624
@property
2725
def _base_manager(cls: type[_Self]) -> BaseManager[_Self]: ... # type: ignore[misc]
2826

2927
class Model(metaclass=ModelBase):
28+
objects: BaseManager[Self]
29+
3030
DoesNotExist: Final[type[ObjectDoesNotExist]]
3131
MultipleObjectsReturned: Final[type[BaseMultipleObjectsReturned]]
3232

scripts/stubtest/allowlist_todo.txt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -331,17 +331,13 @@ django.contrib.gis.db.backends.oracle.features.DatabaseFeatures.supports_toleran
331331
django.contrib.gis.db.backends.oracle.features.DatabaseFeatures.unsupported_geojson_options
332332
django.contrib.gis.db.backends.oracle.introspection
333333
django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns.Meta
334-
django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns.objects
335334
django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys.Meta
336-
django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys.objects
337335
django.contrib.gis.db.backends.oracle.operations
338336
django.contrib.gis.db.backends.postgis.adapter.PostGISAdapter.prepare
339337
django.contrib.gis.db.backends.postgis.features.DatabaseFeatures.empty_intersection_returns_none
340338
django.contrib.gis.db.backends.postgis.features.DatabaseFeatures.supports_geography
341339
django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns.Meta
342-
django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns.objects
343340
django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys.Meta
344-
django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys.objects
345341
django.contrib.gis.db.backends.postgis.operations.PostGISOperations.convert_extent
346342
django.contrib.gis.db.backends.postgis.operations.PostGISOperations.convert_extent3d
347343
django.contrib.gis.db.backends.postgis.operations.PostGISOperator.check_geography
@@ -351,9 +347,7 @@ django.contrib.gis.db.backends.spatialite.features.DatabaseFeatures.can_alter_ge
351347
django.contrib.gis.db.backends.spatialite.features.DatabaseFeatures.django_test_skips
352348
django.contrib.gis.db.backends.spatialite.features.DatabaseFeatures.supports_area_geodetic
353349
django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns.Meta
354-
django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns.objects
355350
django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys.Meta
356-
django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys.objects
357351
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.convert_extent
358352
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.from_text
359353
django.contrib.gis.db.backends.spatialite.operations.SpatiaLiteOperations.geom_lib_version
@@ -1295,7 +1289,6 @@ django.db.migrations.questioner.NonInteractiveMigrationQuestioner.log_lack_of_mi
12951289
django.db.migrations.recorder.MigrationRecorder.Migration.get_next_by_applied
12961290
django.db.migrations.recorder.MigrationRecorder.Migration.get_previous_by_applied
12971291
django.db.migrations.recorder.MigrationRecorder.Migration.id
1298-
django.db.migrations.recorder.MigrationRecorder.Migration.objects
12991292
django.db.migrations.serializer.ChoicesSerializer
13001293
django.db.migrations.utils.FieldReference
13011294
django.db.migrations.utils.field_is_referenced
@@ -1556,7 +1549,6 @@ django.db.models.base.Model.Meta
15561549
django.db.models.base.Model.add_to_class
15571550
django.db.models.base.ModelBase.__new__
15581551
django.db.models.base.ModelBase.add_to_class
1559-
django.db.models.base.ModelBase.objects
15601552
django.db.models.base.ModelStateFieldsCacheDescriptor.__get__
15611553
django.db.models.base.make_foreign_order_accessors
15621554
django.db.models.base.method_get_order

tests/typecheck/models/test_abstract.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
Recursive(parent=Recursive(parent=None))
5252
Concrete(parent=Concrete(parent=None))
5353
out: |
54+
main:4: error: Access to generic instance variables via class is ambiguous
5455
main:4: error: Unexpected attribute "parent" for model "Recursive"
5556
main:4: error: Cannot instantiate abstract model "Recursive"
5657
main:5: error: Unexpected attribute "parent" for model "Recursive"

tests/typecheck/models/test_meta_options.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,12 @@
7979
MyModel.objects.create(field=2)
8080
8181
# Errors:
82-
AbstractModel() # E: Cannot instantiate abstract model "AbstractModel"
83-
AbstractModel.objects.create() # E: Cannot instantiate abstract model "AbstractModel"
82+
AbstractModel()
83+
AbstractModel.objects.create()
84+
out: |
85+
main:8: error: Cannot instantiate abstract model "AbstractModel"
86+
main:9: error: Access to generic instance variables via class is ambiguous
87+
main:9: error: Cannot instantiate abstract model "AbstractModel"
8488
installed_apps:
8589
- myapp
8690
files:

0 commit comments

Comments
 (0)