2

models.py

class User(EmbeddedDocument,Document):
    ''' Store user's info'''
    user_id = IntField(unique = True)
    user_name = StringField(unique =True,primary_key =True,max_length = 256)
    user_secret = StringField(max_length=256)

ビュー.py

def register(request):
    accept = False
    un = request.REQUEST.get('username')
    ps = request.REQUEST.get('password')
    if not un:
        raise ValueError('The given username must be set')
    if not ps:
        raise ValueError('The given password must be set')

    if isUserExistByName(un):
        o='The name has been registered.'
        raise TAUTHException(o)
    else:
        uid = getNextCount(UserCount)
        ps_hash = password_hash(un,ps)
        user = User(user_id = uid,user_name = un,user_secret = ps_hash)
        user.save(cascade = True)
        accept = True

    result = {'accept':accept}
    msg = urlencode(result)
    return HttpResponse(msg)

ユーザーを登録しようとすると、プログラムは正常に実行されますが、mongodb はこのユーザーを保存しません。不思議なことに、User を

class User(Document):
    ''' Store user's info'''
    user_id = IntField(unique = True)
    user_name = StringField(unique =True,primary_key =True,max_length = 256)
    user_secret = StringField(max_length=256)

それはうまく動作し、mongodb はユーザーを正常に保存します。

4

1 に答える 1

0

ドキュメントを参照してください: DocumentおよびEmbeddedDocument :

 class mongoengine.EmbeddedDocument(*args, **kwargs)
   A Document that isn’t stored in its own collection.
   EmbeddedDocuments should be used as fields on Documents through the EmbeddedDocumentField field type.

これは、mongoengine がドキュメント タイプをチェックし、タイプごとに異なるロジックを提供するためです。

ただしforce_insert=True、コレクションに使用するか、mixin を使用してドキュメント定義の重複を避けることができます。

class UserMixin(BaseDocument):
    ''' Store user\'s info'''
    user_id = IntField(unique = True)
    user_name = StringField(unique =True,primary_key =True,max_length = 256)
    user_secret = StringField(max_length=256)

    def __unicode__(self):
        return self.user_name

class User(Document, UserMixin):
    pass

class UserEmbdebed(EmbeddedDocument, UserMixin):
    pass
于 2013-04-21T07:05:26.857 に答える