Note: if you write:
if <expr>: pass
then Python will not check that <expr> == True, it will evaluate the truthiness of the <expr>. Objects have some sort of defined "truthiness" value. The truthiness of True and False are respectively True and False. For None, the truthiness is False, for numbers usually the truthiness is True if and only if the number is different from zero, for collections (tuples, sets, dictionaries, lists, etc.), the truthiness is True if the collection contains at least one element. By default custom classes have always True as truthiness, but by overriding the __bool__ (or __len__), one can define custom rules.
The truthiness of tuple is True given the tuple itself contains one or more items (and False otherwise). What these elements are, is irrelevant.
In case you want to check that at least one of the items of the tuple has truthiness True, we can use any(..):
if not any(details): # all items are empty return Response({}) else: print "Not null"
So from the moment the list contains at least one element, or the dictonary, or both, the else case will fire, otherwise the if body will fire.
If we want to check that all elements in the tuple have truthiness True, we can use all(..):
if not all(details): # one or more items are empty return Response({}) else: print "Not null"
if not any(details):