Skip to content

Instantly share code, notes, and snippets.

@mark-mishyn
Last active January 28, 2021 09:15
Show Gist options
  • Save mark-mishyn/fdb87c7f43e857d6a28588492b37929c to your computer and use it in GitHub Desktop.
Save mark-mishyn/fdb87c7f43e857d6a28588492b37929c to your computer and use it in GitHub Desktop.
Usefull to pretty print Django models or querysets
def tabl(model_or_qs, field_names: str = '', limit: int = 1000):
"""
Examples:
>>> tabl(UserStatus)
or
>>> tabl(User, 'first_name,last_name')
or
>>> tabl(User.objects.filter(is_staff=True), 'first_name,last_name', limit=20)
"""
qs = model_or_qs.objects.all() if inspect.isclass(model_or_qs) else model_or_qs
if not field_names:
model = model_or_qs if inspect.isclass(model_or_qs) else model_or_qs.model
field_names = ','.join(
f.name for f in model._meta.fields[:10] if not isinstance(f, TextField))
if limit: # can be explicitly set to None
qs = qs[:limit]
fields = field_names.split(',')
print(' | '.join(fields))
print('-' * (len(field_names) + field_names.count(',') * 3 - 1))
for obj in qs:
line_items = []
for f in fields:
attr = getattr(obj, f)
if callable(attr):
attr = attr()
line_items.append(str(attr))
print(' | '.join(line_items))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment