Почему добавление этого метода __init __ () нарушает мою модель Django?

Этот вопрос является продолжением вопроса, который я задавал ранееВот.

У меня есть модель Django следующим образом:

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

Оно работает:

>>> MyModel.objects.all()
[<MyModel: MyModel object>, <MyModel: MyModel object>,

Теперь я добавляю следующий конструкторMyModel:

def __init__(self, **kwargs):
    super(MyModel, self).__init__(**kwargs)
    if self.my_field2 is None:
        self.my_field2 = self.my_field1

И это нарушает класс:

>>> MyModel.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "MYvirtualenv/src/django-cache-machine-master/caching/base.py", line 118, in __iter__
    obj = iterator.next()
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 255, in iterator
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/base.py", line 489, in from_db
    new = cls(*values)
TypeError: __init__() takes exactly 1 argument (2 given)

Почему это происходит, когда я добавляю относительно простой конструктор? Как мне это исправить? Мне нужна логика в этом конструкторе, поэтому я не могу просто устранить ее.

 middlestump14 июн. 2016 г., 09:29
Это не продолжение, а дублирование.
 Dean14 июн. 2016 г., 04:40
Похоже, ты скучаешь по аргументам. def __init __ (self, * args, ** kwargs)
 e4c514 июн. 2016 г., 06:38
не использоватьв этом Я добавил ответ на другой ваш вопрос.
 tobltobs14 июн. 2016 г., 05:14
Увидетьstackoverflow.com/questions/843580/... для аналогичного обсуждения.
 Anonymous14 июн. 2016 г., 04:37
У тебя естьMyModel везде, ноPrediction в конструкторе. Вы просто забыли его продезинфицировать или случайно звоните не в тот класс?
 Saqib Ali14 июн. 2016 г., 04:48
@Anonymous. Да. Это была ошибка санитарии. Сожалею. Исправлено сейчас.

Ответы на вопрос(3)

в этом обескуражен. Согласно Django Docs:

https://docs.djangoproject.com/en/1.9/ref/models/instances/#creating-objects

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)

    @classmethod
    def create(cls, title):
        book = cls(title=title)
        # do something with the book
        return book

 book = Book.create("Pride and Prejudice")

Хотя вам настоятельно рекомендуется использоватьclassmethod или пользовательский менеджер в документации, ваш код не будет работать, потому что вы изменили вызывающую подписьsuperclass, который должен был быть:

super(MyModel, self).__init__(*args, **kwargs)

Вы можете избежать этого, используяclassmethod:

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    @classmethod
    def sync_dates(cls, myfield1):
         my_model = cls(my_field1=myfield1, my_field2=myfield1)
         # do something with my_model
         return my_model

А такжеMyModel.sync_dates(some_date) делает трюк.

Или вы можете использовать собственный менеджер, который является предпочтительным способом:

class MyModelManager(models.Manager):
    def create_with_sync_date(self, myfield1):
        my_model = self.create(my_field1=myfield1, my_field2=myfield1)
        # do something with my_model
        return my_model

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    objects_synced = MyModelManager()

И вы можете позвонитьMyModel.objects_synced.create_with_sync_date(some_date)

Вам не нужно использовать__init__ в моделях Django используйте вместоMeta учебный класс

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    class Meta:
        verbose_name = 'My Model'
        verbose_name_plural = 'My Models' # and so on
 Saqib Ali14 июн. 2016 г., 04:50
Это не выполняет ту же функциональность, что и__init__() метод, который я показал.

Ваш ответ на вопрос