Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. from mongoengine import connect, Document, EmbeddedDocument, \
  2. ReferenceField, EmbeddedDocumentListField, StringField, ObjectIdField
  3.  
  4. connect() # Connect to `test` database by default
  5.  
  6. ######
  7. # Option1: Using 2 different collections for users and tickets
  8. ######
  9. class User(Document):
  10. name = StringField()
  11. role = StringField()
  12.  
  13. def get_tickets(self):
  14. return Ticket.objects(assignee=self)
  15.  
  16. class Ticket(Document):
  17. assignee = ReferenceField(User)
  18. content = StringField()
  19.  
  20. # Load some sample data
  21. us1 = User(name='John', role='admin')us2 = User(name='Bob', role='guest').save()
  22. us1.save()
  23. Ticket(assignee=us1, content='Lorem Ipsum').save()
  24. Ticket(assignee=us1, content='whatever').save()
  25. Ticket(assignee=us2, content='blablabla').save()
  26.  
  27. admin_users = User.objects(role='admin')
  28. admin_users_tickets = Ticket.objects(assignee__in=admin_users)
  29. for ticket in admin_users_tickets:
  30. print(ticket.content, ticket.assignee.name, ticket.assignee.id)
  31.  
  32. # prints:
  33. #(u'Lorem Ipsum', u'John', ObjectId('5d04dcb119dca50d61906f19'))
  34. #(u'whatever', u'John', ObjectId('5d04dcb119dca50d61906f19'))
  35.  
  36.  
  37. ######
  38. # Option2: Using 1 single collection and embedding the tickets in each user
  39. ######
  40. class EmbedTicket(EmbeddedDocument):
  41. content = StringField()
  42.  
  43. class NewUser(Document):
  44. name = StringField()
  45. role = StringField()
  46. tickets = EmbeddedDocumentListField(EmbedTicket)
  47.  
  48. # Load sample data
  49. NewUser(name='Malcolm', role='admin', tickets=[EmbedTicket(content='whatever1'), EmbedTicket(content='whatever2')]).save()
  50. NewUser(name='Ulrich', role='guest', tickets=[EmbedTicket(content='whatever99')]).save()
  51.  
  52.  
  53. tickets_per_admin_user = {} # mapping {user_id: ticket}
  54. for user in NewUser.objects(role='admin'):
  55. tickets_per_admin_user[str(user.id)] = user.tickets
  56. print(tickets_per_admin_user)
  57. # prints
  58. # {'5d04dfee19dca50d61906f1e': [<EmbedTicket: EmbedTicket object>, <EmbedTicket: EmbedTicket object>]}
  59.  
  60. ######
  61. # Option3: same as Option2 but keeping the user_id inside the embedded tickets
  62. # Not the one I'd recommend as it duplicates the information and isn't very handy to manipulate
  63. ######
  64. class EmbedTicket2(EmbeddedDocument):
  65. content = StringField()
  66. user_id = ObjectIdField(required=True)
  67.  
  68. class NewUser2(Document):
  69. name = StringField()
  70. role = StringField()
  71. tickets = EmbeddedDocumentListField(EmbedTicket2)
  72.  
  73. us = NewUser2(name='X', role='admin').save()
  74. us.tickets = [EmbedTicket2(content='blabla', user_id=us.id)]
  75. us.save()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement