为什么django不会自动更新外键? (obj.relative.id!= obj.relative_id)

时间:2013-03-25 18:37:21

标签: django django-models

我有这样的代码(Django 1.4.3):

class Peon(models.Model)
  # ...
  order = models.ForeignKey(Order, db_column='idOrder')
  # ... 

  def save(self, *args, **kwargs):
    if self.order_id is None:
      self.order = Order()

    #edit self.order's fields appropriately
    self.order.generate(...)

    self.order.save()

    super(Peon, self).save(*args, **kwargs)

super()。save()抱怨订单不存在。

换句话说,即使设置了self.order.pk,self.order_id仍然为None,这阻止了我保存自己。

我的解决方法是在调用super()之前执行此操作.save():

self.order_id = self.order.pk

我的问题是,为什么这有必要?感觉像self.order.save()应该自动更新外键,但必须有一个很好的理由为什么它不会。

1 个答案:

答案 0 :(得分:3)

self.order = Order()生成订单时,如果您调用订单的save方法,则不会将ID设置为原样。因此,order_id对象的Peon字段设置为无。

如果您的所有订单字段都是可选字段,则可以执行self.order = Order.objects.create()之类的操作,然后正确设置ID。

否则你需要做类似

的事情
def save(self, *args, **kwargs):
  if self.order_id is None:
    order = Order()
    #edit self.order's fields appropriately
    order.generate(...)
    self.order = order

  else:
    #edit self.order's fields appropriately
    self.order.generate(...)

  self.order.save()

  super(Peon, self).save(*args, **kwargs)

如果order.generate当然不需要后向关系。