django поле datetime в абстрактной модели не может обновлять "auto_now_add", "auto_now" - PullRequest
2 голосов
/ 14 июля 2020

Я делаю код с абстрактной моделью для управления созданием и обновлением документов:

class Control(models.Model):
ctrl_dt_add = models.DateTimeField(auto_now_add=True, auto_now=False)
ctrl_dt_mod = models.DateTimeField(auto_now_add=False, auto_now=True)
ctrl_dt_del = models.DateTimeField(default=None,blank=True,null=True)
ctrl_user_add = models.OneToOneField( 
    to=User,
    on_delete=models.DO_NOTHING,
    default=None,
    blank=True,
    null=True,
)
ctrl_user_mod = models.OneToOneField( 
    to=User,
    on_delete=models.DO_NOTHING,
    default=None,
    blank=True,
    null=True,
)
ctrl_user_del = models.OneToOneField( 
    to=User,
    on_delete=models.DO_NOTHING,
    default=None,
    blank=True,
    null=True,
)
ctrl_deleted = models.BooleanField(default=False) 

class Meta:
    abstract = True

И моя модель:

class MyModel(models.Model):
_id = models.ObjectIdField()
..........
control = models.EmbeddedField(
    model_container = Control,
    model_form_class = ControlForm
)
objects = models.DjongoManager()

class Meta:
    db_table = 'mymodel'

def __str__(self):
    return self.value

Моя проблема в том, когда я создаю новый документ в этой модели управляющий ключ вставляет во все ключи datetime нулевое значение, например:

{
"_id" : ObjectId("5f04a3ecc108e12ca4bf5a7f"),
    ............
"control" : {
    "ctrl_dt_add" : null,
    "ctrl_dt_mod" : null,
    "ctrlwdt_del" : null,
    "ctrl_user_add_id" : 1,
    "ctrl_user_mod_id" : null,
    "ctrl_user_del_id" : null,
    "ctrl_deleted" : false
}

}

Мне нужно объявить значения во всех действиях с этой моделью. Сохраняю, создав функцию сохранения в модели. Но мне бы хотелось, чтобы это не требовалось для работы с ним.

def save(self, request=None, *args, **kwargs):
    if request:
        self.control.ctrl_user_mod = request.user
        self.control.ctrl_dt_mod = now()
    super().save(*args, **kwargs)

Спасибо !!

...