2013-05-02 2 views
1

Я создаю приложение преобразования идентификатора продукта. У меня есть две модели, представляющие два стиля ID:Включить сторонний модуль в модели Django

class Id1(models.Model): 
    number = models.CharField(max_length=10) 
    converted = models.CharField(max_length=13) 
    status = models.CharField(max_length=5) # validation status 
    error = models.CharField(max_length=10) # error message 

    def __unicode__(self): 
     return self.number 

class Id2(models.Model): 
    number = models.CharField(max_length=13) 
    converted = models.CharField(max_length=10) 
    status = models.CharField(max_length=5) # validation status 
    error = models.CharField(max_length=10) # error message 

    def __unicode__(self): 
     return self.number 

Там является третьей стороной Python модуль (не Джанго), что я хотел бы включить в модели Django по двум причинам:

  1. Он уже предоставляет функции преобразования Мне нужно
  2. Я хочу использовать OO-подход при выполнении преобразования - создаю экземпляр класса (например, Id1), который инкапсулирует соответствующие данные и методы для этого экземпляра.

модуль Сторонний имеет следующие классы с несколькими полями и методами каждого:

  • класс Id (объект)
  • класс Id1 (Id)
  • класс Id2 (Id)

... и следующие функции верхнего уровня, которые методы класса вызова:

  • Защиту проверка
  • четкости преобразования
  • Защиты calculate_checksum
  • Защиты очистить

Однако, я не хочу атрибутов модуля третьего-участника в базе данных; каждая таблица базы данных должна содержать только поля модели Django (число и преобразование).

Как это можно достичь? Если это невозможно, каковы альтернативные способы решения этой проблемы? Делегировать логику с представлением?

[EDIT] Я забыл добавить, что хотел бы использовать методы модуля для инициализации некоторых полей, таких как «преобразованные», «статус» и «ошибка». есть идеи как это сделать?

+0

Непонятно, что вы здесь задаете. Вы хотите использовать существующий код для преобразования/расчета? Тогда почему бы вам просто не назвать эти функции и т. Д. Из методов на модели? – UloPe

+0

Вы правы. Я забыл упомянуть о важном аспекте: я хочу сохранить возвращаемые значения метода обратно в качестве полей модели. Таким образом, пользовательский метод save() будет включать в себя код из модуля, такой как преобразование Id1 в Id2 и сохранение результата в «преобразованном» поле. Исключения для проверки и преобразования будут влиять на два других поля: «статус» и «ошибка». Все это происходит автоматически при инициализации или сохранении объекта. Возможное? – geeljire

ответ

0

Ну, может быть несколько подходов:

Во-первых, вы можете импортировать модуль и инкапсулировать их соответствующую логику внутри пользовательских методов внутри вашей модели объекта, как это:

import module 
class Id1(models.Model): 

    ... 

    def custom_validate_method(self): 
     # instantiate modules classes needed 
     # write the logic needed 

Тогда вы сможете для вызова этого метода с любым экземпляром класса Id1. Или вы можете также переопределить метод save() выполнить некоторую дополнительную логику при попытке сохраняться объект вроде этого:

def custom_validate_method(self): 
     # instantiate modules classes needed 
     # write the logic needed 

    def save(self, *args, **kwargs): 
     # perform logic (maybe call custom_validate_method) 
     return super(Id1, self).save(*args, **kwargs) 

Вы также можете использовать множественное наследование для достижения этой цели, но смотреть его, множественное наследование может принести некоторое имя конфликты. Это будет выглядеть следующим образом:

import module 
class Id1(models.Model, module.Class): 
number = models.CharField(max_length=10) 
converted = models.CharField(max_length=13) 

def __unicode__(self): 
    return self.number 

Там у вас есть функциональность класса вам нужно в модуле, унаследованной в классе Id1.

Надеюсь, это поможет.

+0

Спасибо. Я попробовал множественное наследование, но он жалуется, что '__init__' требует 2 аргумента и что я даю ему 1. Когда я даю ему 2 (включительно фиктивная строка), он говорит, что я дал ему 3 вместо 2. Кроме того, ваше направление было полезно понять, что вы можете использовать пользовательские методы в модели из импортированного модуля. Однако я хочу сохранить возвращаемые значения этих методов в полях модели. Это возможно? Например, при инициализации объекта Id1 с номером и его сохранении я хочу автоконвертировать его в Id2 и сохранить его как второе поле «преобразован». Большое спасибо Пауло. Большая помощь! – geeljire

+0

Без проблем, я рад, что вы смогли это решить. Конечно, вы можете назначить возвращаемые значения полям. Если вы хотите сделать это изнутри класса, вы это сделаете: 'self.number' = 3, а затем, когда вы сделаете self.save(), он сохранит 3 в базе данных. Для одного и того же метода: 'self.number = custom_method()'. О аргументах '__init__'. При множественном наследовании вы должны переопределить '__init__', а затем вызвать' __init__' каждого суперкласса в пределах ovrrided '__init__', чтобы избежать этих проблем. –

Смежные вопросы