首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保存时检查先前的模型值

在保存时检查先前的模型值
EN

Stack Overflow用户
提问于 2014-09-03 14:52:42
回答 4查看 8.5K关注 0票数 8

我有一个模型可以省去一次远足。用户可以更改这个远足,但是我需要在他更改它之前知道它是什么,因为我跟踪每次旅行有多少次“预订”,如果您更改了您的旅行,我需要从前一次旅行中删除一个预订。

我不完全确定该怎么做。

我猜你是用信号做这个的吧?

我应该使用pre_save,pre_init,还是什么是最好的呢?

pre_save似乎不是正确的,因为它打印新的值,而不是我所期望的“旧值”。

代码语言:javascript
复制
@receiver(pre_save, sender=Delegate)
def my_callback(sender, instance, *args, **kwargs):
    print instance.excursion
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-04 08:00:40

你有几个选择。

首先是覆盖保存方法

代码语言:javascript
复制
#Delegate
def save(self, *args, **kwargs):
    if self.pk:
        previous_excursion = Delegate.objects.get(self.pk).excursion
    super(Model, self).save(*args, **kwargs)
    if self.pk and self.excursion != previous_excursion:
        #change booking

第二种是绑定函数,用于发送保存信号+ django模型利用字段跟踪器

代码语言:javascript
复制
@receiver(post_save, sender=Delegate)
def create_change_booking(sender,instance, signal, created, **kwargs):
    if created:
        previous_excursion = get it from django model utils field tracker
        #change booking

在运行时,另一个解决方案是在pre_save中:

代码语言:javascript
复制
@receiver(pre_save, sender=Delegate)
def my_callback(sender, instance, *args, **kwargs):
    previous_excursion = Delegate.objects.get(self.pk).excursion
    if instance.pk and instance.excursion != previous_excursion:
        #change booking  
票数 11
EN

Stack Overflow用户

发布于 2020-02-20 07:15:55

您可以使用django模型实用程序跟踪django模型字段。看看这个例子。

代码语言:javascript
复制
pip install django-model-utils

然后,您可以定义模型并在模型中使用字段跟踪器。

代码语言:javascript
复制
from django.db import models
from model_utils import FieldTracker

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    tracker = FieldTracker()
    status = models.CharField(choices=STATUS, default=STATUS.draft, max_length=20)

在post保存之后,您可以这样使用:

代码语言:javascript
复制
@receiver(post_save, sender=Post) 
def my_callback(sender, instance,*args, **kwargs):
    print (instance.title)
    print (instance.tracker.previous('title'))
    print (instance.status)
    print (instance.tracker.previous('status'))

这将帮助你做很多关于状态改变的活动。因为覆盖保存方法不是个好主意。

票数 3
EN

Stack Overflow用户

发布于 2017-03-06 16:02:41

作为另一种选择,如果您正在使用Django表单:

您的实例的未来版本存储在模型的Django表单的form.instance中。在保存时,将运行验证,并将此新版本应用于模型,然后保存模型。

这意味着您可以通过比较form.instance和当前模型来检查新版本和旧版本之间的差异。

这是在调用Django Admin的save_model方法时发生的情况。(见cont肋骨/admin/options.py)

如果您可以使用Django表单,我会说,这是最适合Djangothic的方法。

这是使用Django表单处理数据更改的本质:

代码语言:javascript
复制
form = ModelForm(request.POST, request.FILES, instance=obj)
new_object = form.instance  # not saved yet
# changes are stored in form.changed_data
new_saved_object = form.save()

form.changed_data将包含已更改的字段,这意味着如果没有更改,则该字段为空。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25647498

复制
相关文章

相似问题

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