Пропуск полей на модели "сохранить" в Django - PullRequest
1 голос
/ 26 октября 2010

У меня есть модель, которая имеет несколько «автоматических» полей, например:

class Message(Model):
    subject = CharField(max_length = 200)
    message = TextField()
    created = DateTimeField()
    last_status_change = DateTimeField()
    status = CharField(max_length = 10)

В моей базе данных (Postgres) я также установил значения по умолчанию для created, last_status_change, status, также я установил триггеробновлять last_status_change каждый раз, когда status изменяется.

Однако, когда я пытаюсь создать и сохранить экземпляр модели, подобный этому:

m = Message(subject = 'Hello', message = 'Long and boring day')
m.save()

Django пытается вставить NULL в те пропавшиеполя, что неправильно.Есть ли способ заставить его выдавать вставки без этих полей, или мне нужно дублировать функциональность моей БД в коде?

Спасибо!

Ответы [ 3 ]

1 голос
/ 26 октября 2010

вы можете попробовать установить пустое значение на true. Как показано ниже ......

class Message(Model):
    subject = CharField(max_length = 200)
    message = TextField(blank=True,null=True)
    created = DateTimeField(auto_now=True)
    last_status_change = DateTimeField(auto_now=True)
    status = CharField(max_length = 10,blank=True,null=True)

    def save(self):
         self.last_status_change=Datetime.now()


0 голосов
/ 28 октября 2013

Вы можете пропустить поля при обновлении, но при вставке (по проекту).

Если вы хотите установить в поле DateTime дату (например, datetime.now), вы также можете передать вызываемое значение в аргумент по умолчанию и позаботиться о том, чтобы самостоятельно установить время utc (или все, что вы хотите):

ctime = models.DateTimeField(default=datetime.datetime.utcnow)

При сохранении новой строки приведенное выше автоматически вставит текущую дату и время (utc) в качестве значения поля ctime.

Редактировать: только что увидел, что вы также хотите установить mtime, вы можете убедиться, что ваш код работает точно так, как вы хотите, и избежать дополнительного обновления с pre_save signal hook :

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_save, sender=MyModel)
def update_mtime(sender, instance, **kwargs):
    instance.mtime = datetime.datetime.utcnow()
0 голосов
/ 26 октября 2010

Я бы порекомендовал вам ввести значения по умолчанию в определение полей модели и реализовать специальный метод для изменения состояния или переписать метод save () вместо триггеров уровня базы данных.

...