Django Model - 如何覆盖保存方法并创建另一条记录

时间:2012-08-31 18:55:44

标签: django django-models

假设我有这两个类,我想创建并将每个狗记录附加一个项圈记录,如下所示:

class Collar(models.Model):
    serial_number =  models.IntegerField(primary_key=True, db_column='serial_number')
    weight = models.CharField(max_length=10)
    class Meta:
        db_table = u'existing_table_from_before_django_was_born'

class Dog(models.Model):
    size = models.CharField(max_length=10)
    collar = models.OneToOneField(Collar,blank=True, null=True, editable=False)

    def save(self, *args, **kwargs):
        if not self.id:
            self.collar = Collar()
        if self.collar:
            self.collar.weight = '10'
            self.collar.save()
        super(Dog,self).save(*args, **kwargs)

当我运行此代码时,新的Collar记录正在创建,但问题是Dog.collar_id在表中显示为null。

你可以注意到这里的扭曲是Collar类引用了一个现有的表。我把它的主键设置为在MySQL中自动递增,但可能会出现问题。

当我单步执行save方法时,我看到它创建了Collar对象并更新了值,但是self.collar.serial_number打印了'none'。

任何想法可能会发生什么?我永远感激不尽。 (我在1.2.5)

2 个答案:

答案 0 :(得分:2)

您应该将Collar.serial_number字段设为AutoField,以便Django知道它会在保存时自动获取值。

答案 1 :(得分:1)

您的Collar在您保存之前没有 PK,这意味着此时分配将无效。

collar = Collar()
 ...
collar.save()
self.collar = collar