【发布时间】:2019-07-01 20:58:17
【问题描述】:
我的 django 应用程序中有一个信号,我想检查模型中的某个字段是否已更新,这样我就可以继续执行某些操作。
我的模型看起来像这样......
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.PositiveIntegerField()
tax_rate = models.PositiveIntegerField()
display_price = models.PositiveInteger()
inputed_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
我的信号是这样的……
@receiver(post_save, sender=Product)
def update_model(sender, **kwargs):
instance = kwargs['instance']
if 'tax_rate' in kwargs['update_fields']:
# do something
这会返回错误None is not an iterable。我已经阅读了关于update_fields 的django 信号文档,上面写着The set of fields to update as passed to Model.save(), or None if update_fields wasn’t passed to save().
我应该提到我在 django admin 中工作,所以我希望会发生的是,我可以在 django admin 中创建我的 Product 模型的实例,然后如果更新了 tax_rate 或 price 的值,我可以检查对于那些并相应地更新list_price。但是,kwargs['update_fields'] 始终返回 None。
我怎么了?还是有其他方法可以在 django admin 中实现该结果?
更新部分
现在,假设我在我的产品模型中引入了一个名为 inputed_by 的字段,它指向用户模型,并且我希望在首次保存模型时填充该字段。然后另一个字段updated_by 存储最后更新模型的用户。同时我想检查tax_rate或price中的一个或两个是否已更新。
在我的模型管理员中,我有以下方法...
def save_model(self, request, obj, form, change):
update_fields = []
if not obj.pk:
obj.inputed_by = request.user
elif change:
obj.updated_by = request.user
if form.initial['tax_rate'] != form.cleaned_data['tax_rate']:
update_fields.append('tax_rate')
if form.initial['price'] != form.cleaned_data['price']:
update_fields.append('price')
obj.save(update_fields=update_fields)
super().save_model(request, obj, form, change)
我的信号现在看起来像这样......
@receiver(post_save, sender=Product, dispatch_uid="update_display_price")
def update_display_price(sender, **kwargs):
created = kwargs['created']
instance = kwargs['instance']
updated = kwargs['update_fields']
checklist = ['tax_rate', 'price']
# Prints out the frozenset containing the updated fields and then below that `The update_fields is None`
print(f'The update_fields is {updated}')
if created:
instance.display_price = instance.price+instance.tax_rate
instance.save()
elif set(checklist).issubset(updated):
instance.display_price = instance.price+instance.tax_rate
instance.save()
我收到错误'NoneType' object is not iterable
错误似乎来自set(checklist).issubset(updated) 行。我已经尝试在 python shell 中专门运行该行,它产生了预期的结果。这次怎么了?
【问题讨论】:
标签: django django-admin django-signals