瀏覽代碼

Fixed #33733 -- Preserved wrapper assignment for manager methods.

kshivakumar 2 年之前
父節點
當前提交
46efd03d26
共有 2 個文件被更改,包括 10 次插入2 次删除
  1. 2 2
      django/db/models/manager.py
  2. 8 0
      tests/basic/tests.py

+ 2 - 2
django/db/models/manager.py

@@ -1,5 +1,6 @@
 import copy
 import inspect
+from functools import wraps
 from importlib import import_module
 
 from django.db import router
@@ -81,11 +82,10 @@ class BaseManager:
     @classmethod
     def _get_queryset_methods(cls, queryset_class):
         def create_method(name, method):
+            @wraps(method)
             def manager_method(self, *args, **kwargs):
                 return getattr(self.get_queryset(), name)(*args, **kwargs)
 
-            manager_method.__name__ = method.__name__
-            manager_method.__doc__ = method.__doc__
             return manager_method
 
         new_methods = {}

+ 8 - 0
tests/basic/tests.py

@@ -1,3 +1,4 @@
+import inspect
 import threading
 from datetime import datetime, timedelta
 from unittest import mock
@@ -740,6 +741,13 @@ class ManagerTest(SimpleTestCase):
         self.assertEqual(Article.objects.get.__doc__, models.QuerySet.get.__doc__)
         self.assertEqual(Article.objects.count.__name__, models.QuerySet.count.__name__)
 
+    def test_manager_method_signature(self):
+        self.assertEqual(
+            str(inspect.signature(Article.objects.bulk_create)),
+            "(objs, batch_size=None, ignore_conflicts=False, update_conflicts=False, "
+            "update_fields=None, unique_fields=None)",
+        )
+
 
 class SelectOnSaveTests(TestCase):
     def test_select_on_save(self):