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 のままであり、これにより自分自身を保存できません。

私の修正は、super().save() を呼び出す前にこれを行うことでした:

self.order_id = self.order.pk

私の質問は、なぜこれが必要なのですか?self.order.save() は自動的に外部キーを更新するはずですが、そうしないのには十分な理由があるはずです。

4

1 に答える 1

3

order by を生成すると、オーダーのメソッドself.order = Order()を呼び出したときのように id が設定されません。saveしたがって、オブジェクトのorder_idフィールドPeonは None に設定されています。

注文のフィールドがすべてオプションの場合は、次のようなことができ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 に答える