#python #django #django_orm
Есть вот такая система моделей class NormalTag(models.Model): caption = models.CharField(max_length=1024, unique=True, blank=False, default=None) def __init__(self, caption): super().__init__() self.caption = caption def __str__(self): return self.caption class Tag(models.Model): caption = models.CharField(max_length=1024) def __init__(self, caption): super().__init__() self.caption = caption self.set_normaltag() def normalize(self): return self.caption.lower().replace(" ",'').replace("\"",'') def set_normaltag(self): try: normaltag = self.get_normaltag() except NormalTag.DoesNotExist: normaltag = NormalTag(self.normalize()) normaltag.save() def get_normaltag(self): return NormalTag.objects.get(caption=self.normalize()) def __str__(self): return self.caption При вызове из шелла выдает ошибку: [env]user ~/path/to/project > python manage.py shell Python 3.5.2 (default, Jul 5 2016, 12:43:10) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from home.models import NormalTag, Tag >>> t = Tag("ПроВеРка ТэГа") Traceback (most recent call last): File "", line 1, in File "/home/path/to/project/home/models.py", line 28, in __init__ self.set_normaltag() File "/home/path/to/project/home/models.py", line 35, in set_normaltag normaltag = self.get_normaltag() File "/home/path/to/project/home/models.py", line 41, in get_normaltag return NormalTag.objects.get(caption=self.normalize()) File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/query.py", line 379, in get num = len(clone) File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/query.py", line 238, in __len__ self._fetch_all() File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/query.py", line 1087, in _fetch_all self._result_cache = list(self.iterator()) File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/query.py", line 66, in __iter__ obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end]) File "/home/path/to/env/lib/python3.5/site-packages/django/db/models/base.py", line 565, in from_db new = cls(*values) TypeError: __init__() takes 2 positional arguments but 3 were given Так и не понял, откуда она берется.
Ответы
Ответ 1
В джанге много чего происходит магическим образом. То есть во фреймворке не всё соотвествует питону, хотя и написано на нём. В данном случае вы передали позиционный аргумент в модель, а при создании моделей нужно передавать только именованные аргументы. В вашем случае нужно было написать: t = Tag(caption="ПроВеРка ТэГа") И да, в моделях переопределять метод __init__ надо с осторожностью, если нужно добавить какие-то дополнительные действия во время создания модели, то лучше использовать метод менеджера модели create(), он создан специально для этого.Ответ 2
У моделей есть перегруженный метод create() для создания объектов. Не стоит пользоваться конструктором. https://docs.djangoproject.com/en/1.10/ref/models/instances/ - пример сразу тут.
Комментариев нет:
Отправить комментарий