【发布时间】:2021-10-02 02:26:16
【问题描述】:
据我所知,从python manage.py shell 像python manage.py shell < import.py 这样运行脚本是同步完成的:
# models.py
class PersonManager(models.Manager):
def generate_num_children(self, persons):
for person in persons:
person.generate_num_children()
class ParentManager(models.Manager):
def generate_num_grandchildren(self, parents):
for parent in parents:
parent.generate_num_grandchildren()
class Person(models.Model):
objects = PersonManager()
num_children = models.IntegerField(default=0)
parent = models.ForeignKey(related_name="children")
def generate_num_children(self):
self.num_children = 1
self.save()
class Parent(models.Model):
objects = ParentManager()
num_grandchildren = models.IntegerField()
def generate_num_grandchildren(self):
num = 0
for child in self.children.all():
num += child.num_children
self.num_grandchildren = num
self.save()
# import.py
parent = Parent.objects.create(id=1)
person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)
persons = Person.objects.all()
Person.objects.generate_num_children(persons)
parent.generate_num_grandchildren()
# python manage.py shell
Parent.objects.get(id=1).num_grandchildren # Returns 0
但是,当我在 python manage.py shell 或 test 文件中单独输入每一行时,代码会异步运行并给出正确的结果:
parent = Parent.objects.create(id=1)
person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)
persons = Person.objects.all()
Person.objects.generate_num_children(persons)
parent.generate_num_grandchildren()
Parent.objects.get(id=1).num_grandchildren # Returns 3
那么我怎样才能使我的import.py 文件异步呢?
# import.py
# Run first
parent = Parent.objects.create(id=1)
person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)
persons = Person.objects.all()
Person.objects.generate_num_children(persons)
# Run only when previous section is complete
parent.generate_num_grandchildren()
【问题讨论】: