Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法更新Django动态类_Python_Django_Dynamic_Django Models - Fatal编程技术网

Python 无法更新Django动态类

Python 无法更新Django动态类,python,django,dynamic,django-models,Python,Django,Dynamic,Django Models,我有一组DB表,用于存储每天每分钟的客户订单计数。一年中的每个月都是一个不同的表格,以避免表格过大。为了在Django网页中检索这些数据,我动态创建了一个模型类,其中db_表根据从html表单输入接收到的日期填充。问题是,当我用新的日期值重新提交表单时,类不会更新为新模型,它仍然保持旧值 My models.py的外观如下所示: class baseModel(models.Model): id = models.CharField(max_length=40) date = m

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

My 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月数据。我可以从debug语句中看到db_表正在正确更新,但由于某些原因,它无法工作。在分配新的动态模型之前,是否需要取消分配旧的动态模型?在view.py中,我只是这样做(不是在循环中):


非常感谢您的建议。

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

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

下面是一个你可以做的例子(对我来说很有用):

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

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


我希望它能帮助你。尽管我同意您的数据库在不使用多个表的情况下应该可以正常工作…

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

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

下面是一个你可以做的例子(对我来说很有用):

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

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


我希望它能帮助你。尽管我同意您的数据库在不使用多个表的情况下应该可以正常工作…

您需要的是下面的链接:

您需要的是下面的链接:

这不是一个答案,但我想知道您是否真的有需要此解决方案的问题(这可能有点困难)。考虑到一个月(大约)只有43200分钟,这感觉就像。任何半个像样的数据库都可以对日期字段进行索引,然后按其排序/排序。我同意Peter的观点--您可以按日期对数据进行排序,如果数据库的大小无法管理,则可以归档超过30天的行(例如),并将其从生产中删除。这不是答案,但我想知道你是否真的有需要这个解决方案的问题(这可能有点难以解决)。考虑到一个月(大约)只有43200分钟,这感觉就像。任何半正常的数据库都可以对日期字段进行索引,然后按其排序/排序。我同意Peter的观点——您可以按日期对数据进行排序,如果数据库的大小无法管理,则可以归档超过30天的行(例如),并将其从生产中删除。感谢Mariano,这非常有效!每月大约有5000-1亿行。我是一个数据库新手,所以也许我不应该这样设置它。即使表格超过1亿行,建议的索引解决方案是否仍然有效?我不确定。但是你可以通过postgreSQL标签或任何你正在使用的数据库来请求在这类问题上更有经验的人的帮助……谢谢Mariano,这非常有效!每月大约有5000-1亿行。我是一个数据库新手,所以也许我不应该这样设置它。即使表格超过1亿行,建议的索引解决方案是否仍然有效?我不确定。但是你可以通过postgreSQL标签或任何你正在使用的数据库来寻求在这类问题上更有经验的人的帮助。。。
myModel = getModel('duration', startyyyymm)
QS = myModel.objects.using( ...etc
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