0

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

我的 models.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

yyyymm 只是一个字符串,例如 2012 年 4 月的“201204”。因此,如果我在输入框中输入 2012 年 4 月,它可以正常工作,但如果我更改为 2012 年 3 月,它仍然会查询 4 ​​月的数据。我可以从调试语句中看到 db_table 正在正确更新,但由于某种原因它无法正常工作。在分配新的动态模型或其他东西之前,我是否需要解除分配旧的动态模型?在 view.py 中,我只是这样做(不是循环):

myModel = getModel('duration', startyyyymm)
QS = myModel.objects.using( ...etc

非常感谢您的任何想法。

4

2 回答 2

3

您对 python 如何管理动态类的创建有疑问。我不确切知道python是如何工作的,但似乎你这样做的方式并不完全正确。我认为这是因为 python 类附加到一个模块,所以第一次执行“getModel”时,它会按预期创建模型。但是,在那之后,每次你执行“getModel”,因为类总是同名,python不能在同一个模块中创建同一个类,所以它会以某种方式返回你第一次调用时创建的同一个类“获取模型”。(我希望你能理解我的英语,虽然我可能对 python 动态类创建的工作方式有误)

在给您答案之前,我进行了一些搜索并进行了一些测试。似乎创建动态类的最佳方法是使用“类型”(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

如果我没有犯任何复制/粘贴错误,它现在应该适合你。

再次,对不起,如果我犯了任何英语错误。我对用英语和一般英语写作有点生疏:S

我希望它对你有帮助。虽然我同意您的数据库应该可以在不使用多个表的情况下正常工作......

于 2012-05-23T04:26:03.213 回答
1

您需要的所有内容都在以下链接中:https ://code.djangoproject.com/wiki/DynamicModels

于 2012-05-23T11:25:13.450 回答