2012-09-18 156 views
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形式,它的课程进行二,三等相关操作。

所以我决定覆盖保存方法 - 并添加__related_operation。在保存期间,它会检查related_operation是否发生变化 - 如果是这样 - 它应该删除旧的related_operation并保存(创建一个全新的related_operation)...并且它几乎可行! (新的related_operation被添加到数据库中,但是在保存后它会循环,它永远不会结束,我不知道它在做什么,我必须重新启动apache才能从服务器获得任何答案,也许这是愚蠢的错误或者非常复杂的东西 - 即时堆叠...

(当然操作类有多个字段如related_account,所以如果instance.related_account不无:是正确的)

UPDATE:

我发现问题在这里:

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

如果我注释掉上面的一行 - 一切都会好的 - 但当然这是错误的 - 为什么它会阻止某事。

+0

在模型的__init __(),交换两行: 自.__ related_operation = self.related_operation 超(操作,个体经营).__的init __(* ARGS,** kwargs) – karthikr

+0

有什么区别吗? (它不会改变任何东西 - 仍然hungs) –

回答

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,而不是对象,所以转让不火对象的创建。 ..

我认为这可能对别人有帮助。

0

据我了解,您正在尝试执行某种预/后保存操作。这就引出了使用Django的signals

例如在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

+0

我从这个例子http://stackoverflow.com/questions/1355150/django-when-saving-how-can-you-check-if-a-field-has更改 - 这里的人写道,覆盖优先于signalig –