1

私はいくつかのコードをいじっていて、特定の問題に直面していました:

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

私が抱えている問題は、そのフィールドがデータベース内で一意ではないためにobjects.get(slug=slug)、例外がスローされることがあるということです。「else」ステートメントがまだ実行されている間に、MultipleObjectsReturnedどうすればきれいにキャッチできるのだろうか。MultipleObjectsReturned

4

2 に答える 2

2

簡単な解決策:トリックは、メソッドを呼び出すときにMultipleObjectsReturned2番目のステートメント内にトラップすることです。このように、例外は発生せず、実行は正常に続行されます。tryget

作品:

def find_available_slug(object, instance, slug)
    try:
        try:
            sender_node = object.objects.get(slug=slug)
        except object.MultipleObjectsReturned:
            pass
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

動作しません:

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.MultipleObjectsReturned:
        pass
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

2番目の「ナイーブ」メソッドが機能しない理由は、例外がキャッチされた場合、インタープリターがelse:句を通過しないためです。代わりに静かにreturn

于 2012-09-26T20:45:08.893 に答える
2

elseまたは、この句をまったく使用しないでください。

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.DoesNotExist:
        instance.slug = slug
        return
    except object.MultipleObjectsReturned:
        pass

    slug = '%s_' % slug
    find_available_slug(object, instance, slug)
于 2012-09-27T02:46:15.700 に答える