2013-02-19 74 views
1

我下面這個guide和保存時,我得到了以下錯誤......Django的模型誤差最大遞歸深度超過

RuntimeError at /admin/products/product/2/ 
maximum recursion depth exceeded 

爲什麼我得到這個錯誤?我已經在下面列出了完整的模型。

感謝

models.py:

class Product(models.Model): 
    title = models.CharField(max_length=60) 
    qr_url = models.URLField(blank=True) 
    qr_image = models.ImageField(
     upload_to="public/uploads/", 
     height_field="qr_image_height", 
     width_field="qr_image_width", 
     null=True, 
     blank=True, 
     editable=False 
    ) 
    qr_image_height = models.PositiveIntegerField(null=True, blank=True, editable=False) 
    qr_image_width = models.PositiveIntegerField(null=True, blank=True, editable=False) 

    #FK 
    category = models.ManyToManyField(ProductCategory) 
    attribute_answers = models.ManyToManyField(AttributeAnswers) 
    # Custom Managers 

    def __unicode__(self): 
     return self.title 

    def qr_code(self): 
     return '' % self.qr_image.url 
    qr_code.allow_tags = True 

def product_pre_save(sender, instance, **kwargs): 
    if not instance.pk: 
     instance._QRCODE = True 
    else: 
     if hasattr(instance, '_QRCODE'): 
      instance._QRCODE = False 
     else: 
      instance._QRCODE = True 


models.signals.pre_save.connect(product_pre_save, sender=Product) 


def product_post_save(sender, instance, **kwargs): 
    if instance._QRCODE: 
     instance._QRCODE = False 
    if instance.qr_image: 
     instance.qr_image.delete() 
    qr = QRCode(4, QRErrorCorrectLevel.L) 
    qr.addData(instance.qr_url) 
    qr.make() 
    image = qr.makeImage() 

    #Save image to string buffer 
    image_buffer = StringIO() 
    image.save(image_buffer, format='JPEG') 
    image_buffer.seek(0) 

    #Here we use django file storage system to save the image. 
    file_name = 'UrlQR_%s.jpg' % instance.id 
    file_object = File(image_buffer, file_name) 
    content_file = ContentFile(file_object.read()) 
    instance.qr_image.save(file_name, content_file, save=True) 


models.signals.post_save.connect(product_post_save, sender=Product) 

回答

2

你在錯誤的方式copiend從教程:)

def product_post_save(sender, instance, **kwargs): 
    if instance._QRCODE: 
     instance._QRCODE = False 
     if instance.qr_image: 
      instance.qr_image.delete() 
     qr = QRCode(4, QRErrorCorrectLevel.L) 
     qr.addData(instance.qr_url) 
     qr.make() 
     image = qr.makeImage() 

     #Save image to string buffer 
     image_buffer = StringIO() 
     image.save(image_buffer, format='JPEG') 
     image_buffer.seek(0) 

     #Here we use django file storage system to save the image. 
     file_name = 'UrlQR_%s.jpg' % instance.id 
     file_object = File(image_buffer, file_name) 
     content_file = ContentFile(file_object.read()) 
     instance._already_saving = True 
     instance.qr_image.save(file_name, content_file, save=True) 
3

您的文章保存信號呼叫保存一個呼叫後保存信號,節省話費......

這基本上是一個無限循環運行時會因Max Recursion錯誤而導致死機。

0

爲了解決這個問題,你應該在數據庫中添加一個字段,這個字段描述插入的記錄是由簡單的觀點或信號插入。那麼在接收器功能中,您應該檢查是否實例是通過信號插入的,如果是這樣的話,則不應用接收器功能

@receiver(post_save) def my_callback(using,sender,instance,**kwargs): 
    if not(instance.added_by == 'signal'): 
     obj = Student1() 
     obj.name = instance.name 
     obj.city = instance.city 
     obj.state = instance.state 
     obj.postal_code = instance.postal_code 
     obj.age = instance.age 
     obj.added_by = 'signal' 
     obj.save()