Django admin创建新Video条目时覆盖原有条目问题咨询
Django Admin创建新条目覆盖旧条目的问题解决办法
这个问题我之前踩过坑,根源出在你Video模型的id字段默认值设置上!
你现在写的是:
id = models.CharField(primary_key=True, default=uuid.uuid4().hex[:8], editable=False, max_length=8)
这里的问题是:uuid.uuid4().hex[:8]会在模型类第一次加载的时候就执行一次,生成一个固定的8位字符串。之后所有新创建的Video实例,都会用这个固定值作为主键。主键是数据库里的唯一标识,当你创建第二个条目时,因为主键和第一个重复,Django就会直接覆盖掉原来的条目,而不是创建新的。
解决办法
把默认值改成可调用的函数,让每次创建新实例时才生成新的UUID片段:
方式一:用lambda函数简化写法
import uuid from django.db import models class Video(models.Model): id = models.CharField(primary_key=True, default=lambda: uuid.uuid4().hex[:8], editable=False, max_length=8) title = models.TextField(max_length=100, help_text='Insert video title here', verbose_name='Title')
方式二:单独定义生成函数(更易维护)
import uuid from django.db import models def generate_short_unique_id(): # 生成8位的唯一UUID片段 return uuid.uuid4().hex[:8] class Video(models.Model): id = models.CharField(primary_key=True, default=generate_short_unique_id, editable=False, max_length=8) title = models.TextField(max_length=100, help_text='Insert video title here', verbose_name='Title')
额外提醒
如果你已经在数据库里创建过条目,现在数据库里肯定有一个用了那个重复主键的Video记录。建议先删除这条旧数据(或者手动修改它的id为一个不重复的8位字符串),不然修改模型后创建新条目时可能还会有冲突。
内容的提问来源于stack exchange,提问作者Human Cyborg Relations
相关产品推荐
相关产品推荐

