Here would be a possible solution:
# data = [{'EVENT_DELETE': DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)}]
res = filter(
lambda _: _.approved == 1 or (_.reviewed == 1 and _.approved == 0),
(b for a in data for b in a.values())
)
print(next(res))
# DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)
Basically, we just the builtin filter
function and use a custom (lambda-) function.
Note that filter returns a generator-like object. You can wrap it in list
if e.g. you need to access the data multiple times.
PS
As @PatrickArtner pointed out, having a list of dicts w/ 1 value doesn't make sense. Something like this makes more sense:
data = {
"EVENT_DELETE": [
DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0),
DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0),
DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)
]
}
This makes the solutions also much cleaner and simpler as there is no need to loop through values, e.g.
res = filter(
lambda _: _.approved == 1 or (_.reviewed == 1 and _.approved == 0),
data["EVENT_DELETE"]
)