0

クラス:

class Operation(models.Model):
  related_operation = models.ForeignKey('self', null = True)

  __related_operation = None

  def __init__(self, *args, **kwargs):
    super(Operation, self).__init__(*args, **kwargs)
    self.__related_operation = self.related_operation

  def save(self, force_insert=False, force_update=False):
    if self.related_operation != self.__related_operation:
      del self.__related_operation

    super(Operation, self).save(force_insert, force_update)
    self.__related_operation = self.related_operation

コード:

 (...)
 OperationFormSet = modelformset_factory(Operation, form=OperationCategoryOnlyForm)
  if request.method == "POST":
    formset = OperationFormSet(request.POST, queryset=Operation.objects.filter(category=category_id))
    if formset.is_valid():
      instances = formset.save(commit = False)
      for instance in instances:
        if instance.related_account is not None:
          related_operation = Operation()
          related_operation.related_operation = instance
          related_operation.save()
          instance.related_operation = related_operation

        instance.save()

      formset = OperationFormSet(queryset=Operation.objects.filter(category=category_id))
  else:
    formset = OperationFormSet(queryset=Operation.objects.filter(category=category_id))

と問題:

メソッドを上書きせずに保存すると、すべてが正しく機能しますが、related_operationをフォームで変更すると、もちろん2番目、3番目などの関連する操作になります。

そこで、saveメソッドを上書きして__related_operationを追加することにしました。保存中に、related_operationが変更されているかどうかを確認します(変更されている場合)。古いrelated_operationを削除し、保存する必要があります(完全に新しいものを作成します。related_operation)...そしてほぼ機能します。(新しいrelated_operationはデータベースに追加されますが、保存後にループします。終了することはありません。何をしているのかわかりません。サーバーから応答を取得するには、apacheを再起動する必要があります。ばかげたタイプミスか非常に複雑なものかもしれません-私は積み重ねられています...

(もちろん、操作クラスには、related_accountなどの複数のフィールドがあるため、if instance.related_accountがNoneではない場合:正しい)

アップデート:

問題はここにあることがわかりました:

def __init__(self, *args, **kwargs):
  super(Operation, self).__init__(*args, **kwargs)
  #self.__related_operation = self.related_operation

上記の行をコメントアウトすると-すべてがうまくいきます-しかしもちろんそれは間違っています-なぜそれがsthをブロックするのですか?

4

2 に答える 2

0

私は問題がどこにあるかを見つけ、解決策を見つけました...

initで同じタイプのオブジェクトをリンクしようとしました。そのため、初期化中にオブジェクトの別のインスタンスを作成して、オブジェクトが停止するまで別のインスタンスを作成します。

したがって、解決策(今のところ-おそらく誰かが最もよく提示します)は次のとおりです:

class Operation(models.Model):
  related_operation = models.ForeignKey('self', null = True)

  __related_operation = None

  def __init__(self, *args, **kwargs):
    super(Operation, self).__init__(*args, **kwargs)
    self.__related_operation = self.related_operation_id

  def save(self, force_insert=False, force_update=False):
    super(Operation, self).save(force_insert, force_update)
    if self.related_operation is not None:
      if self.related_operation_id != self.__related_operation:
        if self.__related_operation is not None:
         Operation.objects.get(id = self.__related_operation).delete()

    if self.related_operation is not None:
      self.__related_operation = self.related_operation_id

  def __unicode__(self):
    return str(self.id)

ご覧のとおり、オブジェクトの代わりにIDを使用しているため、割り当てによってオブジェクトの作成が開始されることはありません...

これは他の誰かに役立つと思います。

于 2012-09-21T20:43:14.873 に答える
0

私が理解している限り、あなたはある種の保存前/保存後のアクションを実行しようとしています。これはDjangoのシグナルを使用するように頼みます

たとえばmodels.py

import django.db.models.signals.pre_save

def my_handler(sender, **kwargs):
  if not kwargs['instance'].related_operation:
    new_related_operation = Operation(related_operation = kwargs['instance'])
    new_related_operation.save() # this will cause calling signal again
    kwargs['instance'].related_operation = new_related_operation

pre_save.connect(my_handler, sender=Operation)

HTH

于 2012-09-18T23:32:03.263 に答える