python - Python 代码仅在 print 语句更改后才有效
问题描述
所以我现在遇到了最奇怪的问题......我的代码只工作一次。之后,我需要更改代码中的打印语句,否则它不再起作用。
我perform_city_actions_in_order
从外部类和那里调用,如您所见,我调用get_city_action_queue
的应该返回一个数据库对象列表。当它工作时,它会对对象执行一个操作并更改状态,使其不再匹配查询get_city_action_queue
。但是,当数据库表中的一行发生更改以使其与查询匹配get_city_action_queue
时,如果我不更改代码中的打印语句,则不再返回它。
此外,如果我更改其中的打印语句,perform_city_actions_in_order
它也可以工作,但只能工作一次。
class CityHelper:
def get_city_action_queue(city, actions_until_time=datetime.now()):
queue = []
fields = city.resource_fields.all().filter(status="Under Construction", action_done_time__lte=actions_until_time) | city.resource_fields.all().filter(status="Upgrading")
buildings = city.buildings.all().filter(status="Under Construction", action_done_time__lte=actions_until_time) | city.buildings.all().filter(status="Upgrading")
queue.extend(fields)
queue.extend(buildings)
print("this needs to change between executions for the above code to work")
return queue
def perform_city_actions_in_order(city, actions_until_time=datetime.now()):
print("city", city)
queue = CityHelper.get_city_action_queue(city, actions_until_time)
print("before", queue)
queue.sort(key = lambda x:x.action_done_time)
print("after", queue)
for action in queue:
print("perfofming ", action)
if(action.__class__.__name__ == "ResourceFieldModel"):
ResourceHelper.upgradeResourceField(action)
elif(action.__class__.__name__ == "BuildingModel"):
BuildingHelper.upgradeBuilding(action)
这是我的模型,但这些不应该是问题,因为代码中的逻辑似乎有效。
class BuildingModel(models.Model):
position = models.IntegerField(default=0)
building_type = models.CharField(max_length=32)
status = models.CharField(max_length=32)
action_done_time = models.DateTimeField(default=None, null=True)
level = models.IntegerField(default=0)
city = models.ForeignKey(CityModel, on_delete=models.CASCADE, null=True, related_name='buildings')
objects = BuildingManager()
def __str__(self):
return self.building_type + " in " + self.city.city_name + " at position: " + str(self.position)
class ResourceFieldModel(models.Model):
position = models.IntegerField(default=0)
field_type = models.CharField(max_length=10)
status = models.CharField(max_length=32)
action_done_time = models.DateTimeField(default=None, null=True, blank=True)
level = models.IntegerField(default=0, verbose_name='level')
city = models.ForeignKey(CityModel, on_delete=models.CASCADE, null=True, related_name='resource_fields')
objects = ResourceFieldManager()
def __str__(self):
return self.field_type + " at: " + str(self.position) + " in " + self.city.city_name