【问题标题】:Django Model - How to override save method and create another recordDjango 模型 - 如何覆盖保存方法并创建另一条记录
【发布时间】:2012-08-31 18:55:43
【问题描述】:

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

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)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

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

    【讨论】:

    • 成功了!我想知道是否值得在任何地方使用此信息更新 Django 文档?
    【解决方案2】:

    您的Collar 在您保存之前没有 PK,这意味着此时分配将不起作用。

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

    【讨论】:

    • 这似乎仍然不起作用。但我认为这是我所做的,我将用我遗漏的(可能很重要的)细节来更新我的问题。
    • 这不是一个“细节”,这是一个完全不同的问题。
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多