用foreignkey字段创建django模型

时间:2018-01-29 13:56:12

标签: django django-models

假设我有以下型号:

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模型的创建效果很好)。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我认为问题在于您将ForeignKey声明为blank=Truenull=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)