Reputation: 113
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
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
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
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