无法更新Django动态类

2024-06-24 12:15:47 发布

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

我有一组数据库表,每天每分钟存储客户订单数。一年中的每个月都是不同的表,以避免表过大。为了在我的Django网页中检索这些数据,我动态地创建一个模型类,根据从html表单输入接收的日期填充db_table。问题是,当我用一个新的日期值重新提交表单时,类没有更新为应该是新模型的内容,它仍然保持旧的值。在

我的模型.py看起来像这样:

class baseModel(models.Model):
    id = models.CharField(max_length=40)
    date = models.IntegerField()
    minute = models.IntegerField()
    totalorders = models.IntegerField()
    class Meta:
        abstract = True
        managed = False

def getModel(type, yyyymm):
    if type == 'duration':
        class DurationClass(baseModel):
            medianduration = models.IntegerField()
            avgduration = models.IntegerField()
            class Meta:
                db_table='orderTable' + yyyymm
                #debug statement
                print db_table
        return DurationClass

yyymm只是一个字符串,比如2012年4月的'201204'。因此,如果我在输入框中输入2012年4月,它可以正常工作,但如果我改为2012年3月,它仍然会查询4月的数据。我可以从debug语句中看到db\u表正在被正确更新,但由于某些原因它不能工作。在分配新的动态模型之前,是否需要取消分配旧的动态模型?在视图.py,我只是在做这个(不是循环):

^{pr2}$

非常感谢你的任何想法。在


Tags: 数据py模型表单dbmodelstypetable
2条回答

对于python如何管理动态类的创建有一个问题。我不知道python到底是如何工作的,但似乎您这样做的方式并不完全正确。我认为这是因为python类附加到一个模块上,所以第一次执行“getModel”时,它会按照您的预期创建模型。但是,在这之后,每次执行“getModel”时,由于类的名称始终相同,python无法在同一个模块中创建同一个类,因此它会以某种方式返回第一次调用“getModel”时创建的类。(我希望你能理解我的英语,尽管我可能对python动态类创建的工作原理有误解)

在给你答案之前,我做了一些测试。创建动态类的最佳方法似乎是使用“type”(python内置方法),因此可以为每个表创建一个类(这些类必须具有不同的名称)。在

下面是一个你能做的事情的例子(对我来说很管用):

def getModel(type, yyyymm):
    if type == 'duration':
        newModelClass = type(
            'newModelName', #It could be the table name you are going to search in. It must be different for every different db table you want to use. For example: 'orderTable' + yyyymm
            (baseModel, ), #Base class for your new model
            {
                'medianduration' : models.IntegerField(), #New model's attribute
                'avgduration' : models.IntegerField(), #New model's attribute
                '__module__':__name__, #This is required. If not given, type raises a KeyError
                'Meta': type(
                                'Meta',
                                (object,),
                                {
                                    'db_table':'orderTable' + yyyymm, #Here you put the table name you want to use
                                    '__module__':__name__,
                                }
                        )
            }
       )
       return newModelClass

如果我没有犯任何复制/粘贴错误,现在应该对你有用了。在

再说一次,如果我犯了英语错误,很抱歉。我对用英语和一般英语写作有点生疏

我希望这对你有帮助。尽管我同意您的数据库应该可以正常工作,而不使用多个表。。。在

相关问题 更多 >