我有在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_save
,post_save
......”这样的信号。
任何人都知道如何使用Django ORM解决我的问题?
如果它只在管理员中更改,您可以覆盖管理员上的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)
在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')