user1640189
user1640189

Reputation: 113

Python: loop over classes?

How can I combine the following into a loop in 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

As we can see it's the same code block, just with the class name changing in each one, so I'm looking to iterate over an array of class names and run each through a generated function with the same semantics as above.

Upvotes: 3

Views: 227

Answers (3)

yilmazhuseyin
yilmazhuseyin

Reputation: 6612

(I am guessing that those are django models.)

If those models have foreignkey relationships with each-other, Just deleting top model should delete the rest of it. So if FacebookUser is your top model, following call should delete rest of the models. (Guessinsg that user and FaceBookUser have one to one ralationship)

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

But this is a lot of guessing. If some or all of those guesses are wrong you should use Querysets delete method 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()

This will run 4 queries and delete multiple rows with each query. You should avoid using for loops with orm models.

Upvotes: 0

null
null

Reputation: 11839

You can iterate on tuple:

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

Upvotes: 3

phihag
phihag

Reputation: 287755

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

Upvotes: 5

Related Questions