2

簡単なシナリオを次に示します。コメントが添付されたブログ投稿があります。ここで、mongoformsを使用して、ユーザーがコメントを送信できるようにします。したがって、私はこのmodels.pyを持っています:

class Post(Document):
    title = StringField(max_length=60)
    body = StringField()
    created = DateTimeField(default=datetime.datetime.now)
    comments = ListField(EmbeddedDocumentField('Comment'))

class Comment(EmbeddedDocument):
    author = StringField(max_length=60)
    body = StringField()
    created = DateTimeField(default=datetime.datetime.now)

そして、 forms.py内で同様のModelForm機能をサポートするためにdjango-mongoformsを使用しています:

class CommentForm(MongoForm):
    class Meta:
        document = Comment
        fields = ('author', 'body')

views.pyに、ユーザーが入力した内容、より具体的にはコメントの作成者フィールドと本文フィールドを保存したいだけです。コメントを追加する方法は次のとおりです。

def add_comment(request, id):
    post = Post.objects.with_id(id)
    if request.method == 'POST':
        form = CommentForm(request.POST, instance=post.comments)
        if form.is_valid():
            form.save()
    return HttpResponseRedirect(post.get_absolute_url())

次に、[送信]ボタンをクリックすると、エラーメッセージが表示されます。

インスタンスは、BaseListではなくmongoengineドキュメントである必要があります

したがって、質問は次のとおりです。

  1. BaseListをMongoEngineでドキュメントに変換する方法は?私はヒントなしでドキュメントを調べました。
  2. EmbeddedDocumentを処理するための一般的なベストプラクティスは何ですか?ReferenceDocumentは役に立ちますか?

また、ここには関連する質問がありますが、答え はありません。mongoengineで埋め込まれたドキュメントのリストフィールドを更新する適切な方法は何ですか?

4

1 に答える 1

2

コメントが埋め込まれているため、投稿オブジェクト内の既存のコメントを見つけて更新する必要があります。次に、古いコメントを新しいコメント( iはインデックス)で上書きできます。例:

post.comments[i] = new_comment

次に、を実行するだけでpost.save()、mongoengineはそれを$set操作に変換します。

または、直接書くこともできます$set。例:

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

Forms.py

私はまだforms.pyを使用していますが、それに渡すcommit=Falsesaveコメントが返されます。次に、投稿に追加して、次のように投稿を保存します。

def add_comment(request, id):
    post = Post.objects.with_id(id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            post.comments.append(comment)
            post.save()
    return HttpResponseRedirect(post.get_absolute_url())
于 2012-01-31T10:08:11.273 に答える