2011-01-21 11 views
1

私はdjangoを使用して、デバイス上のデバイスと分析レポートが管理される内部Webアプリケーションを構築しています。 は現在、抽象的分析は次のように定義されています。クラス属性をDjangoのモデルに追加するにはどうすればよいですか?

class Analysis(models.Model): 
    project = models.ForeignKey(Project) 
    dut = models.ForeignKey(Dut) # Device Under Test 
    date = models.DateTimeField() 
    raw_data = models.FileField(upload_to="analysis") 
    public = models.BooleanField() 

    @property 
    def analysis_type(self): 
     s = str(self.__class__) 
     class_name = s.split('.')[-1][:-2] # Get latest name in dotted class name as remove '> at end 
     return AnalysisType.objects.get(name=class_name) 

    class Meta: 
     abstract = True 

は異なる結果のデータと、そのデバイス上で行うことができます異なる分析タイプの数があります。

class ColorAnalysis(Analysis):  
    value1 = models.FloatField() 
    value2 = models.FloatField() 
    ... 

class DurabilityAnalysis(Analysis):  
    value1 = models.FloatField() 
    value2 = models.FloatField() 
    ...  

... 

このような分析は、オペレータが投稿したExcelシートから作成されます。オペレータが各分析タイプごとに入力するExcelテンプレートが存在します。 (データの入力をWebフォームで行う必要がある場合は、Excelのパスを選択する理由はたくさんあります) ウェブサイト上のページには、すべての分析タイプが対応するExcelへのリンクと共にリストされている必要がありますその分析を報告するために使用されるシートテンプレート。

私が何をしたいのかそれがクラスとして、このデータを追加することですが、現在、私は私が

class AnalysisType(models.Model): 
    name = models.CharField(max_length=256) 
    description = models.CharField(max_length=1024,blank=True) 
    template = models.FileField(upload_to="analysis_templates") 

のようなものを定義したが、私はしかし、私は別の解析結果モデルクラスにこのデータをリンクする方法についています各分析タイプに属性を追加します。 問題は、クラス属性が既に各インスタンスのデータを定義するためにdjangoの魔法によって使用されていることです。

「クラス属性」をdjangoモデルに追加するにはどうすればよいですか?これを解決する方法の他のアイデア?

EDIT: クラス名を検索して、analysis_typeプロパティを追加しました。これは、各サブクラスに変数を手動で追加する必要はありません。うまく動作しますが、各サブクラスに対応するAnalysisTypeのエントリを手動で追加する必要があります。これがクラスシステムによっても処理できるなら、いいでしょう。何か案は?

答えて

2

特定のAnalysisサブクラスの属性に依存するAnalysisTypeを返すプロパティまたはメソッドはありますか?

class Analysis(models.Model): 
    ... 
    @property 
    def analysis_type(self): 
     return AnalysisType.objects.get(name=self.analysis_type_name) 

class ColorAnalysis(Analysis): 
    analysis_type_name = 'color' 

class DurabilityAnalysis(Analysis): 
    analysis_type_name = 'durability' 
+0

はい。それはおそらく動作します。あなたの "analysis_type_name"ではなく、クラス名を取得する方が良いでしょう。私は、通常のクラスシステムができるだけ多く扱うことを望んでいます。 –

関連する問題