Skip to content

Instantly share code, notes, and snippets.

@Kamori
Created August 19, 2017 02:45
Show Gist options
  • Save Kamori/2b574057e9f514732e9c9296136d7929 to your computer and use it in GitHub Desktop.
Save Kamori/2b574057e9f514732e9c9296136d7929 to your computer and use it in GitHub Desktop.
A ponyorm recursive to_dict example
{1: {'answers': [{'answer': 'here is the answer',
'bestof_question': [],
'created': datetime.datetime(2017, 8, 19, 2, 41, 58),
'id': 1,
'updated': datetime.datetime(2017, 8, 19, 2, 41, 58)}],
'bestanswer': None,
'created': datetime.datetime(2017, 8, 19, 2, 41, 58),
'id': 1,
'statusid': {'Name': 'Example', 'id': 1},
'tags': [],
'updated': datetime.datetime(2017, 8, 19, 2, 41, 58),
'userid': {'created': datetime.datetime(2017, 8, 19, 2, 41, 58),
'email': '[email protected]',
'id': 1,
'updated': datetime.datetime(2017, 8, 19, 2, 41, 58),
'username': 'Kamori'}}}
from datetime import datetime
from pony.orm import *
from pony.orm.core import Entity
import pprint
def recursive_to_dict(dataset, _has_iterated=False, **kwargs):
if isinstance(dataset, Entity):
dataset = dataset.to_dict(**kwargs)
delete_these = []
for key, value in dataset.items():
if _has_iterated:
if isinstance(value, (list, tuple)):
for iterable in value:
if isinstance(iterable, Entity):
delete_these.append(key)
break
continue
else:
if isinstance(value, (list, tuple)):
value_list = []
for iterable in value:
if isinstance(iterable, Entity):
value_list.append(recursive_to_dict(iterable, True,
**kwargs))
dataset[key] = value_list
if isinstance(value, Entity) and not _has_iterated:
dataset[key] = recursive_to_dict(value, True, **kwargs)
elif isinstance(value, Entity) and _has_iterated:
delete_these.append(key)
for deletable_key in delete_these:
del dataset[deletable_key]
return dataset
db = Database()
class Question(db.Entity):
_table_ = 'Questions'
id = PrimaryKey(int, auto=True)
userid = Required('User')
title = Required(LongStr)
question = Required(LongStr)
statusid = Required('Status')
tags = Set('Tag')
answers = Set('Answer', reverse='questionid')
bestanswer = Optional('Answer', nullable=True, reverse='bestof_question')
created = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
updated = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
class Answer(db.Entity):
_table_ = 'Answers'
id = PrimaryKey(int, auto=True)
answer = Required(str)
questionid = Required(Question, reverse='answers')
statusid = Required('Status')
userid = Required('User')
bestof_question = Set(Question, reverse='bestanswer')
created = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
updated = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
class Status(db.Entity):
_table_ = 'Statuses'
id = PrimaryKey(int, auto=True)
Name = Required(str, unique=True)
questions = Set(Question)
answers = Set(Answer)
class User(db.Entity):
_table_ = 'Users'
id = PrimaryKey(int, auto=True)
username = Required(str, unique=True)
email = Required(str, unique=True)
questions = Set(Question)
answers = Set(Answer)
created = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
updated = Optional(datetime, sql_default="CURRENT_TIMESTAMP")
class Tag(db.Entity):
_table_ = 'Tags'
id = PrimaryKey(int, auto=True)
questions = Set(Question)
sql_debug(True)
db.bind(provider='sqlite', filename=':memory:', create_db=True)
db.generate_mapping(create_tables=True)
# with db.set_perms_for(Question, Answer, Status, Tag):
# perm('view', group='anybody')
with db_session:
s = Status(Name="Example")
u = User(username='Kamori', email='[email protected]')
q = Question(statusid=s, userid=u, title='What is the answer',
question='please give me the answer')
a = Answer(answer='here is the answer', questionid=q, userid=u,
statusid=s)
resp = {}
dataset = select(quest for quest in Question)
for res in dataset:
resp[res.id] = recursive_to_dict(res, with_collections=True,
related_objects=True)
pprint.pprint(resp)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment