3

我有这样的代码(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,这使我无法保存 self。

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

self.order_id = self.order.pk

我的问题是,为什么这是必要的?感觉 self.order.save() 应该自动更新外键,但一定有充分的理由不这样做。

4

1 回答 1

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不需要后向关系。

于 2013-03-25T19:18:24.310 回答