需求
如上方截图,“路径”的字段名为path
,是按照url拼接出来的路径,毫无疑问,最后一个数字是该列数据的id。
不过实例未创建时,是不会有id的,意味着path
只能在数据创建后才能写入。当然,人工是可以完成这个工作的,但未免太低效率了。有什么办法可以实现保存后再自动读取id然后拼接path
,自动更新数据呢?
最后,尝试了一下django的信号机制,真是美滋滋。其实很简单,当这列数据create
时,发信号通知数据自己,再把数据中的path
更新一下。代码如下:
@admin.register(FestivalGoods)
class FestivalGoodsAdmin(admin.ModelAdmin):
list_display = ['goods_id', 'order', 'url', 'type', 'is_active', 'is_show_home', 'price', 'discount_price', 'sales', 'integration', 'created_time', 'update_time', 'views', 'image_url']
def save_model(self, request, obj, form, change):
if not change:
obj.stuff = request.user
#新增时,自动生成商品编码, 节日海报传入的参数`FEL`是节日的缩写
from utils.auto_goods_id import create_goods_id
obj.goods_id = create_goods_id('FEL')
super().save_model(request, obj, form, change)
super().save_model(request, obj, form, change)
#创建实例完成后,给自己发个信号,更新url字段,拼接方式为 `xxxxx/实例的id` 供前端小程序发请求用
from django.dispatch import receiver
from django.db.models.signals import post_save
@receiver(post_save, sender=FestivalGoods)
def update_ulr(sender, instance, created, **kwargs):
if created:
instance.url = '/api/v01/festival/viewlist/' + str(instance.id) #这个拼接规则来自于url配置,不能轻易改变urls.py
instance.save()
pass
注意:
在 def update_url
中,必须是created
为 true
才执行,不然会报错:
maximum recursion depth exceeded while calling a Python object