Python: loop over classes?



如何在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

正如我们所看到的,它是相同的代码块,只是每个代码块中的类名都在更改,因此我希望遍历一个类名数组,并通过一个生成的函数运行每个类名,其语义与上面相同。

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

您可以迭代元组:

for klass in FacebookProfile, FacebookUser, FacebookLike, FacebookInvite:
    try:
        for ob in klass.objects.filter(user_id=user.id):
            ob.delete()
    except klass.DoesNotExist:
        pass

(我猜那些是django模型。

如果这些模型彼此之间存在外键关系,则仅删除顶部模型应删除其余模型。因此,如果FacebookUser是您的顶级模特,则以下调用应该删除其余的模特。(猜测用户和FaceBookUser有一对一的对比)

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 个查询,并为每个查询删除多行。应避免将 for 循环与 orm 模型一起使用。

最新更新