我的模型有一个自定义主键和一个带有auto_now_add = True的DateTimefield:
slug = models.CharField(max_length=5, primary_key=True)
created_on = models.DateTimeField(auto_now_add=True)
我注意到几百个中的一些对象的值为#34; created_on",即使此字段不允许Null值。任何想法如何可能?
此密钥是通过此自定义保存覆盖随机生成的:
def save(self, *args, **kwargs):
if self.slug == '':
self.slug = generate_random_slug()
while True:
try:
super(MyClass, self).save(*args, **kwargs)
break
except IntegrityError:
self.slug = generate_random_slug()
答案 0 :(得分:2)
如果您尝试保存具有primary_key=True
字段且另一个字段auto_now_add=True
的对象,其中数据库中已存在具有相同主键值的对象,则会导致错误由DB抛出或者可能只是将其设置为null。看起来你最有可能在你的slug中发生碰撞(看起来它是5个字符长,很容易产生碰撞)。您可能希望使用具有较低碰撞概率的generate_random_slug
。像uuid
这样的东西可能很有用。
这是一个假设,需要查看更多代码才能确认。