奇怪的Django ORM行为与线程

2024-04-16 12:02:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Django项目中启动的线程中访问queryset结果时遇到了一些非常奇怪的情况。你知道吗

出现的问题是,在线程的init中,所有操作都正常工作,但是当我完成run()方法中应该相同的操作时,它们返回空。代码和结果如下。你知道吗

任何关于如何解决这种奇怪行为的想法都将不胜感激。你知道吗

代码:

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


Tags: run代码selfforminitallemptyfinal
1条回答
网友
1楼 · 发布于 2024-04-16 12:02:02

如果您阅读Python27\lib中thread类的文档\螺纹.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.

所以把你的代码改成

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

然后运行你的代码

相关问题 更多 >