需求
如上方截图,“路径”的字段名为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
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)
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)
instance.save()
pass
注意: 在 def update_url 中,必须是created 为 true 才执行,不然会报错:
maximum recursion depth exceeded while calling a Python object
|