首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django在创建/编辑新实例时运行函数,并让该函数更改创建/编辑的实例中的变量

Django在创建/编辑新实例时运行函数,并让该函数更改创建/编辑的实例中的变量
EN

Stack Overflow用户
提问于 2020-07-10 08:49:24
回答 1查看 183关注 0票数 0

我有一个Django模型,它有一个名为reserve_time的用户输入字段。当用户输入并创建(或编辑)类的一个实例时,我希望运行一个函数,并检查输入的时间是在晚餐还是午餐期间。我一直在尝试使用post_save来做这件事,但是它没有起作用,print语句会告诉我它是否是晚餐,但是类的实例根本不会改变。另外,我目前的方法Reservation.objects.last()只有在我创建一个新实例时才有效,而不是在我编辑旧实例时有效。

models.py:

代码语言:javascript
运行
复制
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()的方法,它只调用我正在更改或添加的特定实例?为什么我在if/else语句中改变变量移位实际上并没有改变它呢?我的最终目标是在任何时候创建/编辑新实例时都能自动工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-10 08:55:51

你用reservation = Reservation.objects.last()做什么?您有一个向您发送信号的instance

代码语言:javascript
运行
复制
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方法

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62825760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档