首页 > 解决方案 > 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

标签: pythondjango

解决方案


推荐阅读