0

1日1分あたりの顧客注文数を保存するDBテーブルのセットがあります。過度に大きなテーブルを避けるために、1年の各月は異なるテーブルです。Django Webページでこのデータを取得するために、htmlフォーム入力から受け取った日付に基づいてdb_tableが入力されたモデルクラスを動的に作成します。問題は、新しい日付値を使用してフォームを再送信しても、クラスが新しいモデルに更新されず、古い値が保持されることです。

私の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クラスが1つのモジュールにアタッチされているためだと思います。そのため、初めて「getModel」を実行すると、期待どおりにモデルが作成されます。ただし、その後、「getModel」を実行するたびに、クラスは常に同じ名前であるため、Pythonは同じモジュールで同じクラスを作成できないため、最初に呼び出したときに作成したのと同じクラスが返されます。 「getModel」。(Pythonの動的クラスの作成方法については間違っているかもしれませんが、私の英語を理解していただければ幸いです)

私はあなたに答えを与える前に少し検索していくつかのテストをします。動的クラスを作成する最良の方法は「type」(python組み込みメソッド)を使用することであるように思われるため、テーブルごとに1つのクラスを作成できます(このクラスには別の名前を付ける必要があります)。

これがあなたができることの例です(それは私のために働きました):

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 に答える