在开发过程中,难免会遇到要求删除时不删除数据本身,而是在建model的时候有一个model字段,点击删除按钮后,给字段的值更新为点击删除操作的时间,下面我们进入正题:
而在django里面删除数据有两种方式,一种是在数据详情页面删除,如下所示:
另外一种是选择数量进行删除,如下所示:
两种删除方式略有不同,所以我们都要设置,才能实现真正想要的效果。
首先,创建一个delete_at字段,字段类型为DateTimeField,字段允许为空,默认值为空,字段名词为删除时间,接着我们重写delete方法,当每次在详情页执行删除操作时,将delete_at的值修改为删除操作执行的时间,并保存。
class VideoInfo(models.Model):
create_at = models.DateTimeField(auto_now_add=True, null=True, verbose_name="创建时间")
update_at = models.DateTimeField(auto_now=True, verbose_name="修改时间")
delete_at = models.DateTimeField(null=True, default=None, verbose_name="删除时间")
playback_volume = models.IntegerField(default=0, verbose_name="播放量")
# 设置软删除,删除时不删除数据,而是给原本空的删除字段值修改为删除操作执行的时间
def delete(self, using=None, keep_parents=False):
self.delete_at = datetime.datetime.now()
self.save()
然后我们在到admin里面添加actions,并在下面重写删除方法。
@admin.register(VideoInfo)
class VideoInfoAdmin(admin.ModelAdmin):
search_fields = ("video_title",)
readonly_fields = ("delete_at",)
list_display = ("id",
"video_title",
"video_addr",
"video_id",
"video_size",
"video_classification",
"playback_volume",
"server_phone",
"create_at",
"update_at",
"delete_at")
actions = ['delete_selected']
def delete_selected(modeladmin, request, queryset):
c = 0
for i in queryset:
i.delete()
c += 1
msg = '成功删除了{}个表管理'.format(c)
modeladmin.message_user(request, msg)
delete_selected.short_description = '删除已选项'
之后我们分别到详情页和列表页执行删除操作,可以看到数据本身并没有被删除,而是将原本的空值,修改为了删除操作执行的时间。