Last active
March 6, 2023 18:35
-
-
Save pingwping/92219a8a1e9d44e1dd8a to your computer and use it in GitHub Desktop.
Create and update embedded documents with MongoEngine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# REF: http://www.quora.com/How-do-I-create-and-update-embedded-documents-with-MongoEngine | |
class Comment(EmbeddedDocument): | |
content = StringField() | |
name = StringField(max_length=120) | |
class Post(Document): | |
title = StringField(max_length=120, required=True) | |
author = StringField(required=True) | |
tags = ListField(StringField(max_length=30)) | |
comments = ListField(EmbeddedDocumentField(Comment)) | |
# Create a post: | |
post = Post(title="Quora rocks", author="Ross", tags=['tutorial', 'how-to']) | |
post.save() | |
# Find a post | |
post = Post.objects.find(title="Quora rocks").first() | |
# Create a new comment | |
comment = Comment(content="Great post!", name="john") | |
# Add to comments list and save | |
post.comments.append(comment) | |
post.save() | |
# To editing existing comments you can use atomic updates[1] or simply change the comment and call post.save() (this will also do an atomic update). | |
# Update a comment in place | |
post = Post.objects.find(title="Quora rocks").first() | |
post.comments[0].name = "John" | |
post.save() | |
# Or update with a set operation | |
post = Post.objects.find(title="Quora rocks", comment__name="john").update(set__comment__S__name="John) |
If you have to update a list of fields based on a JSON or dictionary objects, you could also use the following:
update_comment = {content = "content update",
name = "name update"}
post = Post.objects.get(title="Quora rocks")
comment = post.comments.get(name="john")
for key in update:
comment[key] = update_comment[key]
post.save()
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
gives me this error:
ValidationError (Content:61728559370921cb26f21091) (Only lists and tuples may be used in a list field: ['geofences'])
UPDATE
That was a form validation error, caused by not reassigning the field geofences to the newly created list.
Sorry, but If for @pingwping is ok, I leave this comment as it can be of some help for someone else. so if you need, read below.
Where geofences is a
Geofence(EmbeddedDocument)
and Content is a
Document
that hasgeofences: ListField(EmbeddedDocumentField(Geofence))
I used it like this:
The weird thing is, even if I am getting this error, the
new_gf
is correctly appended to the list, if I try to append a list it doesn't and it gives me error because it doesn't recognise the creation of the Geofence.Am I doing something wrong?
Anyone noticed it?
Thanks to anyone who can help and thank you @pingwping for the useful gist 💥