私のモデルには、カスタム主キーとauto_now_add = TrueのDateTimefieldがあります。
slug = models.CharField(max_length=5, primary_key=True)
created_on = models.DateTimeField(auto_now_add=True)
このフィールドではNull値が許可されていなくても、数百のうちのいくつかのオブジェクトの「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()
回答:
回答№1は0次のフィールドを持つオブジェクトを保存しようとした場合 primary_key=True
そしてもう一つの auto_now_add=True
データベースにオブジェクトがすでに存在する場合同じ主キー値を使用すると、DBによってエラーがスローされるか、場合によってはnullに設定されます。スラッグで衝突が発生している可能性が高いようです(5文字の長さで、衝突が非常に簡単に発生するようです)。あなたはおそらく使用したい generate_random_slug
衝突確率が低くなります。何かのようなもの uuid
有用かもしれない。
これは仮説であり、確認するためにさらにコードを確認する必要があります。