3

このガイドに従っていますが、保存すると次のエラーが発生します...

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)
4

4 に答える 4

5

あなたのpostsaveシグナルcallsaveはpostsaveシグナルを呼び出します。postsaveシグナルはsaveを呼び出します...

これは基本的に、ランタイムが最大再帰エラーで強制終了する無限ループです。

于 2013-02-19T16:57:13.033 に答える
3

あなたはチュートリアルから間違った方法で共犯します:)

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)
于 2013-02-19T17:02:17.913 に答える
0

この問題を解決するには、データベースにもう1つのフィールドを追加する必要があります。このフィールドは、挿入されたレコードが単純なビューまたはシグナルによって挿入されることを示します。次に、レシーバー機能で、インスタンスがシグナルによって挿入されているかどうかを確認する必要があります。挿入されている場合は、レシーバー機能を適用しないでください。

@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()
于 2016-07-03T06:10:39.537 に答える
0

私のアプローチは、Modelからオブジェクトを保存するのではなく、QuerySetオブジェクトのudpateメソッドを使用することです。

Model.objects.filter(pk=obj.pk).update(fieldx=valuey)
于 2018-09-06T03:42:02.070 に答える