Django запускать функцию, когда создается / редактируется новый экземпляр, и функция изменяет переменную в созданном / редактируемом экземпляре - PullRequest
0 голосов
/ 10 июля 2020

У меня есть модель Django, в которой есть введенное пользователем поле с именем reserve_time. Когда пользователь входит и создает (или редактирует) экземпляр класса, я хочу, чтобы функция запускалась и проверяла, во время ли введенного времени время обеда или ужина. Я пытался использовать post_save для этого, но он не работал, оператор печати мог бы сказать, был ли это ужин или нет, но экземпляр класса вообще не изменился бы. Также текущий способ, которым я это делаю Reservation.objects.last(), работает только в том случае, если я создаю новый экземпляр, а не если я редактирую старый.

models.py:

from django.db import models
import datetime
import operator
from django.utils.timezone import now, localtime
from django.db.models.signals import post_save


# Create your models here.

class Reservation(models.Model):
    shift = ''
    name = models.CharField(max_length=40)
    member_id = models.CharField(max_length=10, default="")
    guest_num = models.IntegerField()
    reserve_time = models.TimeField(default=datetime.datetime.now)
    notes = models.CharField(max_length=100, blank=True)
    date_created = models.DateTimeField(default=datetime.datetime.now, blank=True)


    def __str__(self):
        return f"{self.name} at {self.reserve_time.strftime('%I:%M %p')} ({self.shift}) {self.date_created.strftime('%m/%d/%Y')}"



def model_created_or_updated(sender, **kwargs):
    the_instance = kwargs['instance']
    reservation = Reservation.objects.last()

    if reservation.reserve_time < datetime.time(17, 10, 0):
        reservation.shift = 'lunch'
        print('lunch')
    else:
        reservation.shift = 'dinner'
        print('dinner')

    print('model created/updated')

post_save.connect(model_created_or_updated, sender=Reservation)

Есть ли замена для Reservation.objects.last (), которая просто вызывает указанный экземпляр c, который я изменяю или добавляю? и почему мое изменение переменной shift в операторе if / else на самом деле не меняет его? Моя конечная цель состоит в том, чтобы это работало автоматически при создании / редактировании нового экземпляра.

1 Ответ

2 голосов
/ 10 июля 2020

зачем вы используете reservation = Reservation.objects.last()? у вас есть instance, который отправляет вам сигнал

the_instance = kwargs['instance']
if the_instance.reserve_time < datetime.time(17, 10, 0):
    the_instance.shift = 'lunch'
    print('lunch')
else:
    the_instance.shift = 'dinner'
    print('dinner')

print('model created/updated')

, вы можете сделать это другим способом - переопределить save метод вашей модели

class Reservation(models.Model):
...
    def save(self, *args, **kwargs):
        if self.reserve_time < datetime.time(17, 10, 0):
            self.shift = 'lunch'
            print('lunch')
        else:
            self.shift = 'dinner'
            print('dinner')
        print('model created/updated')
        return super().save(*args, **kwargs)
...