Как я могу добавить атрибуты класса для моделей в Django? - PullRequest
1 голос
/ 21 января 2011

Я использую 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, который оператор заполняет для каждого типа анализа. (Проблема здесь не в том, что ввод данных должен выполняться в веб-форме, есть много причин для выбора пути в 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, соответствующей каждому подклассу. Было бы хорошо, если бы это могло быть обработано системой классов. Есть идеи?

1 Ответ

2 голосов
/ 21 января 2011

Как насчет свойства или метода, который возвращает AnalysisType, зависящий от атрибута в определенном подклассе Analysis?

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'
...