Как обновить время события в модели Django?
У меня есть следующий код. Ожидаемый результат будет следующим:
- Если событие не существует, то в форме администратора отображается только время created_at, поле updated_at пусто.
- Если событие существует: a. если нет updated_at, то поле будет заполнено временем сейчас. b. если updated_at существует, поле time должно быть обновлено.
Мой код не работает, как мне его изменить? Спасибо.
from django.db import models
from django.utils.timezone import now
import uuid
class Venue (models.Model):
class Types(models.TextChoices):
LPN='LPN',
RN ='RN'
type = models.CharField(
max_length=3,
choices=Types.choices,
default=Types.RN
)
venue_id= models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_at = models.DateTimeField(default=now, editable=True,null=True, blank=True)
if venue_id is True:
updated_at = models.DateTimeField(default=now, editable=True,null=True, blank=True)
updated_at.update()
else:
updated_at = models.DateTimeField(default=None, editable=True,null=True, blank=True)
place_text=models.CharField(max_length=200)
date = models.DateField ('Date')
start_time = models.DateTimeField ('start time')
finish_time= models.DateTimeField ('finish time')
details= models.CharField (max_length=500)
def _str_(self):
return self.venue_text
обратитесь к прилагаемому снимку экрана.
Подобная логика должна выполняться через сигнал.
https://docs.djangoproject.com/en/4.0/ref/signals/#post-save
Если задать логику на модели таким образом, она не регистрирует изменения.
Переопределите ваши модели со всеми полями, которые вы хотите, чтобы они имели, если вы хотите
поле update_at должно быть нулевым при создании, пока оно не будет действительно
обновлено, используйте default=None, в противном случае вы можете использовать auto_now.
Если вы хотите, чтобы после редактирования какого-либо поля происходило определенное действие,
используйте сигналы.
from django.db import models
from django.utils import timezone
from django.utils.timezone import now
from django.dispatch import receiver
from django.db.models.signals import (
pre_save,
post_save
)
# Create your models here.
class Venue (models.Model):
class Types(models.TextChoices):
LPN='LPN',
RN ='RN'
type = models.CharField(
max_length=3,
choices=Types.choices,
default=Types.RN
)
created = models.DateTimeField(default=now, editable=True,null=True, blank=True)
updated = models.DateTimeField(default=None, editable=True,null=True, blank=True)
date = models.DateField ('Date')
start_time = models.DateTimeField ('start time')
finish_time= models.DateTimeField ('finish time')
details= models.CharField (max_length=500)
place_text=models.CharField(max_length=200)
def __str__(self):
return self.place_text
@receiver(pre_save, sender=Venue)
def venue_pre_save(sender, instance, *args, **kwargs):
#instance.updated =None
instance.updated=timezone.now()
@receiver(post_save, sender=Venue)
def venue_post_save(sender, instance,created, *args, **kwargs):
if created:
instance.updated=timezone.now()
instance.save()