2011-09-02 14 views
7

Estoy intentando definir métodos para realizar comprobaciones y actualizaciones en un campo de lista de documentos incrustados en mongoengine. ¿Cuál es la forma correcta de hacer lo que estoy tratando de hacer? El código está abajo.¿Cuál es la forma correcta de actualizar un campo de lista de documentos incrustados en mongoengine?

class Comment(EmbeddedDocument): 
    created = DateTimeField() 
    text = StringField() 

class Post(Document): 
    comments = ListField(EmbeddedDocumentField(Comment)) 

    def check_comment(self, comment): 
     for existing_comment in self.comments: 
      if comment.created == existing_comment.created and 
       comment.text == existing_comment.text: 
       return True 
     return False 

    def add_or_replace_comment(self, comment): 
     for existing_comment in self.comments: 
      if comment.created == existing_comment.created: 
       # how do I replace? 

     # how do I add? 

¿Es esta la forma correcta de hacer algo como esto?

Respuesta

1

Necesita encontrar el índice del comentario existente.

A continuación, puede sobrescribir el antiguo comentario con el comentario (donde i es el índice), por ejemplo:

post.comments[i] = new_comment 

a continuación, sólo hacer un post.save() y mongoengine que convertirá a una operación de $set.

Alternativamente, usted podría escribir el $set por ejemplo:

Post.objects(pk=post.pk).update(set__comments__i=comment) 
2

Se podría utilizar un EmbeddedDocumentListField en lugar de una lista de documentos incrustados. De esta manera se obtiene acceso a algunos handy methods como filtro, crear o actualización:

class Comment(EmbeddedDocument): 
    created = DateTimeField() 
    text = StringField() 

class Post(Document): 
    comments = EmbeddedDocumentListField(Comment) 

    ... 

    def add_or_replace_comment(self, comment): 
     existing = self.comments.filter(created=comment.created) 
     if existing.count() == 0: 
      self.comments.create(comment) 
     else: 
      existing.update(comment) 

(código no probado)

+1

nota de actualización toma argumentos de palabras clave de modo comentario debe ser un diccionario de valor clave pares que desempaqueta 'existing.update (** comment)' –

Cuestiones relacionadas