假设我有以下型号:
class Room(models.Model):
title = models.CharField(max_length=255)
room_log = models.ForeignKey("Log", on_delete=models.CASCADE, blank=True, null=True)
...
class Log(models.Model):
fs = FileSystemStorage(location=LOG_PATH)
name = models.CharField(max_length=255)
log = models.FileField(storage=fs, blank=True, null=True)
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
if not os.path.exists(LOG_PATH):
os.makedirs(LOG_PATH)
self.log.save(self.name + '.log', ContentFile('start of log!'))
return super(Log, self).save(force_insert, force_update, using, update_fields)
else:
if not os.path.isfile(LOG_PATH + self.name + ".log"):
self.log.save(self.name + '.log', ContentFile("start of log!"))
else:
pass
return super(Log, self).save(force_insert, force_update, using, update_fields)
我想为我创建的每个Room模型分配一个具有相同房间名称的新Log模型。 我已经尝试过编辑Room模型的save()函数,如下所示:
def save(self, *args, **kwargs):
if not self.pk:
Log.objects.create(name=self.title)
return super(Room, self).save(*args, **kwargs)
但是在创建新的Room模型时它只返回错误
UNIQUE constraint failed: chat_log.id(Log模型的创建效果很好)。
我该怎么做?
答案 0 :(得分:0)
我认为问题在于您将ForeignKey
声明为blank=True
和null=True
,因此如果您已经有一个空Room
的{{1}}个实例尝试使用空ForeignKey
创建另一个ForeignKey
会抛出UNIQUE constraint failed
。
因此,您需要为Room
实例分配一个Log
实例!
事实上,在您提供的代码中,您没有为Log
个实例分配任何Room
个实例,而只是创建了一个新的Log
!
如果您想在保存Log
时分配Room
,请更改此行:
Log.objects.create(name=self.title)
到此:
self.room_log = Log.objects.create(name=self.title)