如何在Django ORM中触发字段更改

问题描述 投票:0回答:2

我有在Django上写的项目。在另一个项目中,我使用SQLAlchemy,并使用非常有用的方法来触发字段更改:

@event.listens_for(ClassName.field_name, 'set')
def func_name(target, value, oldvalue, initiator):
    if value == oldvalue:
        return

在我的Django项目中,我有Order类:

class Order(models.Model):
    PAYMENT_CHOICES = (
        ('Paid', 'Paid'),
        ('Not Paid', 'Not Paid')
    )
    EXECUTION_CHOICES = (
        ('Done', 'Done'),
        ('In Progress', 'In Progress')
    )
    name = models.CharField(max_length=255, default='')
    skype = models.CharField(max_length=255, default='')
    email = models.CharField(max_length=255, default='')
    status_of_execution = models.CharField(max_length=255, choices=EXECUTION_CHOICES, default='In Progress')
    status_of_payment = models.CharField(max_length=255, choices=PAYMENT_CHOICES, default='Not Paid')
    client_comment = models.TextField(blank=True, null=True)
    admin_comment = models.TextField(blank=True, null=True)
    total_price = models.IntegerField(null=False, blank=False, default=0)

    buyer = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)

status_of_execution字段仅在管理面板中更改,因此我想在此字段更改时触发,如果更改值Done则执行某些操作。但是我找不到像SQLAlchemy那样的解决方案,因为Django只有像“pre_savepost_save ......”这样的信号。

任何人都知道如何使用Django ORM解决我的问题?

python django sqlalchemy django-orm
2个回答
1
投票

如果它只在管理员中更改,您可以覆盖管理员上的save_model并检查表单的changed_data列表:

class OrderAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if 'status_of_execution' in form.changed_data:
            if form.cleaned_data['status_of_execution'] == 'Done':
                # do stuff
        return super().save_model(request, obj, form, change)

0
投票

在Django中使用pre_save信号。

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


@receiver(pre_save, sender=Order)
def event_handler(instance, **kwargs):

        old_instance = Order.objects.get(id=instance.id)
    except Order.DoesNotExist:
        # Created not Updated
        return 

    if instance.status_of_execution != old_instance.status_of_execution:
        print('status_of_execution changed')
© www.soinside.com 2019 - 2024. All rights reserved.