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 是一对一的关系)

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

但这是很多猜测。如果这些猜测中的一部分或全部是错误的,您应该使用 Querysets 删除方法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 回答