2016-09-22 51 views
3

我已经设置django项目与mongoengine与django使用mongodb。我创建了2个模型,并且它们工作正常,但是当我为一个模型使用信号侦听器时它还侦听另一个模型,那么如何将信号绑定到它们的模型?Mongoengine信号收听所有模型

这里是我的模型,用户代码:

from mongoengine import * 
from mongoengine import signals 
from datetime import datetime 


class User(Document): 
    uid = StringField(max_length=60, required=True) 
    platform = StringField(max_length=20, required=True) 
    index = StringField(max_length=80) 
    last_updated = DateTimeField(required=True, default=datetime.now()) 

    meta = { 
     'collection': 'social_users' 
    } 


def before_save(sender, document, **kwargs): 
    if document.platform and document.uid: 
     document.index = document.platform+'/'+document.uid 

signals.pre_save.connect(before_save) 

这里的另一种模式Error

from mongoengine import * 
from datetime import datetime 


class Error(Document): 
    call = DictField(required=True) 
    response = DictField(required=True) 
    date = DateTimeField(default=datetime.now(), required=True) 

    meta = { 
     'collection': 'errors' 
    } 

下面是我使用的测试代码文件:

from src.social.models.error import Error 
from src.social.models.user import User 

error = Error.objects.first() 

print(error.to_json()) 

但它不起作用,抛出以下错误:

AttributeError: 'Error' object has no attribute 'platform' 

请帮我这个,谢谢。

回答

3

我想通了绑定的特定型号的信号的方式,这里的代码我是如何做的:

from mongoengine import * 
from mongoengine import signals 
from datetime import datetime 


class User(Document): 
    uid = StringField(max_length=60, required=True) 
    platform = StringField(max_length=20, required=True) 
    index = StringField(max_length=80) 
    last_updated = DateTimeField(required=True, default=datetime.now()) 

    meta = { 
     'collection': 'social_users' 
    } 

    @classmethod 
    def pre_save(cls, sender, document, **kwargs): 
     if document.platform and document.uid: 
      document.index = document.platform+'/'+document.uid 

signals.pre_save.connect(User.pre_save, sender=User) 

希望这有助于谁面临同样的问题的人。