2014-01-20 64 views
0

我想要在Django项目中启动的线程中访问查询集结果时发生了一些非常奇怪的事情。线程奇怪的django ORM行为

问题引起的是,在线程的init一切工作正常,但是当我完成run()方法中应该是相同的动作 - 它们返回空。代码和结果如下。

任何想法如何解决这种奇怪的行为,将不胜感激。

CODE:

class FinalDataCreator(threading.Thread): 

    def __init__(self, final_form_entry, **kwargs): 

      print "WORKS", final_form_entry.user_form_entries.all() 

      self.final_form_entry = final_form_entry 
      print "WORKS", self.final_form_entry.user_form_entries.all() 

      self.weirdest_thing = self.final_form_entry.user_form_entries.all() 

      self.jondykeman = "JonDykeman" 

      super(FinalDataCreator, self).__init__(**kwargs) 

     def run(self): 

      print "EMPTY", self.final_form_entry.user_form_entries.all() 

      print "EMPTY", self.weirdest_thing 

      print "WORKS", self.jondykeman 

      print "WORKS", self.final_form_entry 

new_test = FinalDataCreator(final_form_entry) 
new_test.start() 

结果再次

WORKS [<ReviewCustomFormEntry: ReviewCustomFormEntry object>] 
WORKS [<ReviewCustomFormEntry: ReviewCustomFormEntry object>] 
EMPTY [] 
EMPTY [] 
WORKS "JonDykeman" 
WORKS ReviewCustomFormEntry 

感谢,JD

回答

0

如果你读线程类的Python27的文档\ LIB \ threading.py它说.. 。

If a subclass overrides the constructor, it must make sure to invoke 
the base class constructor (Thread.__init__()) before doing anything 
else to the thread. 

So查NGE你的代码像

class FinalDataCreator(threading.Thread): 

def __init__(self, final_form_entry, **kwargs): 

     super(FinalDataCreator, self).__init__(**kwargs) #why you need to pass **kwargs 

     print "WORKS", final_form_entry.user_form_entries.all() 

     self.final_form_entry = final_form_entry 
     print "WORKS", self.final_form_entry.user_form_entries.all() 

     self.weirdest_thing = self.final_form_entry.user_form_entries.all() 

    def run(self): 

     print "EMPTY", self.final_form_entry.user_form_entries.all() 

     print "EMPTY", self.weirdest_thing 

然后运行代码

+0

您好,我刚跑了相同的结果,新的代码。任何其他想法? – jondykeman

+0

将** kwargs传递给init方法的任何原因。你也可以尝试在__init__中初始化任何简单的字符串或整数值,然后在run方法中访问它...就像在init:self.name =“jondykeman”和run:print self.name中一样。请让我知道结果 – anuragal

+0

嗨,本质上,我在__init__中设置的其他任何内容都被称为没有问题。它似乎只是正在被擦除的查询集。我几十次使用这种方法没有问题 - 这是一个非常奇怪和令人讨厌的事件。 – jondykeman