2013-03-29 56 views
0

我似乎无法使用Django设置实例变量。无法为使用Django的对象设置实例变量

我希望发生的是:

a,b = User(), User() 
a.set_status('abc') 
b.set_status('def') 
b.get_status() 
>>> 'def' 
a.get_status() 
>>> 'abc' 

不幸的是,不断发生的事情是:

a,b = User(), User() 
a.set_status('abc') 
b.set_status('def') 
b.get_status() 
>>> 'def' 
a.get_status() 
>>> 'def' 

我相信这是因为status变量是一个类变量而不是一个实例变量。我如何使代码像我想要的那样行事?我的模特儿在下面。

class Status(models.Model): 

    def __init__(self, status = '', time=datetime.datetime.min, *args, **kwargs): 
     self.status = status 
     self.status_time = time 
     super(Status, self).__init__(*args, **kwargs) 

    def set_status(self, s): 
     self.status = s 
     self.status_time = datetime.datetime.now() 
     self.save() 
    def get_status(self): 
     now = datetime.datetime.now() 
     if now-self.status_time<datetime.timedelta(minutes=15): 
      return self.status 
     return None 


class User(models.Model): 
    facebook_id = models.CharField(max_length=200) 
    friends = ListField() 
    status = Status() 

    @classmethod 
    def create_user(cls, fid, friends): 
     k = User() 
     k.facebook_id = fid 
     k.friends = friends 
     k.status = Status() 
     k.status.save() 
     k.save() 

    def login(self, facebook_friends): 
     self.friends = facebook_friends 
     self.save() 

    def set_status(self, status): 
     self.status.set_status(status) 
     #return matching statuses 

    def get_status(self): 
     return self.status.get_status() 
+1

嗯,你有没有阅读过文档,或者按照模型及其关系上的教程?我从来没有见过像这样实现的模型... – Ngenator

+2

@Ngenator是正确的。在您的用户模型中,您应该通过'status = models.ForeignKey(Status)'来更改'status = Status()'。不是这样? – danihp

回答

1

status属性是全球。它是User类的一部分,不是实际的实例。所以这实际上是正常的行为。 set_status()将通过get_status()设置可用于每个User实例的全局status

你应该重新设计你的模型。无论如何,你并不需要Status。您可以直接在用户方法set_statusget_status中拥有该业务逻辑。但是,如果您需要跟踪每个状态更改,那么只需将ForeignKey设置为状态模型。

+0

谢谢,真的有帮助!我现在工作:) – Abs

相关问题