Python:循环遍历类?

时间:2012-09-30 09:51:33

标签: python

如何将以下内容组合成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

我们可以看到它是相同的代码块,只是每个类名都在改变,所以我希望迭代一个类名数组,并通过生成的函数运行每个代码块,其语义与上面相同。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

(我猜这些是django模型。)

如果这些模型彼此之间存在外键关系,则删除顶级模型应删除其余部分。因此,如果FacebookUser是您的顶级模型,则跟随调用应删除其余模型。 (猜猜用户和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循环。