3

以下をPythonでループに結合するにはどうすればよいですか?

    try:
        [fb.delete() for fb in FacebookProfile.objects.filter(user_id=user.id)]
    except FacebookProfile.DoesNotExist:
        pass

    try:
        [fb.delete() for fb in FacebookUser.objects.filter(user_id=user.id)]
    except FacebookUser.DoesNotExist:
        pass

    try:
        [fb.delete() for fb in FacebookLike.objects.filter(user_id=user.id)]
    except FacebookLike.DoesNotExist:
        pass

    try:
        [fb.delete() for fb in FacebookInvite.objects.filter(user_id=user.id)]
    except FacebookInvite.DoesNotExist:
        pass

ご覧のとおり、同じコード ブロックであり、クラス名がそれぞれ変更されているだけです。そのため、クラス名の配列を反復処理し、生成された関数を上記と同じセマンティクスで実行することを検討しています。

4

3 に答える 3

5
for klass in [FacebookProfile, FacebookUser, FacebookLike, FacebookInvite]:
    try:
        for fb in klass.objects.filter(user_id=user.id):
            fb.delete()
    except klass.DoesNotExist:
        pass
于 2012-09-30T09:54:56.517 に答える
3

タプルを繰り返すことができます:

for klass in FacebookProfile, FacebookUser, FacebookLike, FacebookInvite:
    try:
        for ob in klass.objects.filter(user_id=user.id):
            ob.delete()
    except klass.DoesNotExist:
        pass
于 2012-09-30T09:55:53.630 に答える
0

(私はそれらが django モデルであると推測しています。)

これらのモデルが互いに外部キー関係にある場合、最上位モデルを削除するだけで残りのモデルが削除されます。FacebookUser が最上位モデルの場合、次の呼び出しで残りのモデルを削除する必要があります。(user と FaceBookUser は 1 対 1 の関係にあると推測します)

FaceBookUser.objects.get(user_id=user.id).delete()

しかし、これは多くの推測です。これらの推測の一部またはすべてが間違っている場合は、クエリセットの削除メソッドを使用する必要がありますhttps://docs.djangoproject.com/en/dev/ref/models/querysets/#delete

FaceBookUser.objects.filter(user_id=user.id).delete()
FaceBookProfile.objects.filter(user_id=user.id).delete()
FaceBookLike.objects.filter(user_id=user.id).delete()
FaceBookInvite.objects.filter(user_id=user.id).delete()

これにより、4 つのクエリが実行され、クエリごとに複数の行が削除されます。orm モデルで for ループを使用することは避けてください。

于 2012-09-30T10:29:16.140 に答える