Python:如何循环遍历类?

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

我们可以看到这是相同的代码块,只是每个代码块中的类名不同,所以我想对一个类名数组进行迭代,并将每个类名通过生成的函数运行,其语义与上述相同。


delete() 方法到底是做什么的? - Tim Pietzcker
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

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
使用“except:”是一个不好的主意,因为你可能会捕获到你不想要的异常。 - Gareth Latty

0
(我猜这些是django模型。)
如果这些模型之间有外键关系,只需删除顶级模型即可删除其余模型。所以如果FacebookUser是你的顶级模型,下面的调用应该可以删除其他模型。(猜测user和FaceBookUser之间有一对一的关系)
FaceBookUser.objects.get(user_id=user.id).delete()

但这是许多猜测。 如果这些猜测中的一些或全部错误,则应使用Queryset的删除方法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循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接