Правильный выбор класса ребенка - PullRequest
1 голос
/ 21 февраля 2012

Я учу Джанго (и программирование) в свободное время.Это забавно, но у меня возникла проблема с тем, как логически провести различие между двумя моделями с общим родителем.

Что я хотел бы сделать, так это иметь форму, в которой я могу ввести машину и файл дляОтправь это.У меня проблема в том, что у меня есть два типа машин (это связь по RS-232). Эти машины имеют аппаратное или программное управление потоком.

Я установил URL / TransferProgram /, чтобы взять введенные данные формы и отправить их в нужное место.Я не знаю, как правильно выбрать параметры машины.

OfficeMachine - это аппаратная машина с управлением потоком, а GarageMachine - программная система с управлением потоком

Я отправляю свою форму для отправки файла 001 в OfficeMachine (какчтобы узнать, является ли OfficeMachine программным или аппаратным обеспечением)

Models.py

class SerialMachine(models.Model):
    EVEN = 1
    ODD = 2
    NONE = 3
    PARITY_CHOICES = (
        (EVEN, "Even"),
        (ODD, "Odd"),
        (NONE, "None"),
    )

    machineName = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    baudRate = models.IntegerField(max_length=50)
    parity = models.IntegerField(max_length=1, choices=PARITY_CHOICES)
    dataBits = models.IntegerField(max_length=15)
    stopBits = models.IntegerField(max_length=15)
    carriageReturn = models.BooleanField(default=False)
    lineFeed = models.BooleanField(default=True)
    endProgramChar = models.BooleanField(default=True)
    machineServer = models.ForeignKey('SerialPortServer')
    repository = models.ForeignKey('Repository')

    class Meta:
        abstract = True

    def __unicode__(self):
        return self.machineName

class HardwareFlowControlMachine(SerialMachine):
    """
    Represents all CNC machines that are to be connected for a hardware flow
    control connection
    """
    enableRTSCTS = models.BooleanField(default=False) # RTS/CTS Flow Control
    enableDSRDTR = models.BooleanField(default=True) # DSR/DTR Flow Control

class SoftwareFlowControlMachine(SerialMachine):
    """"
    Represents all CNC machines that are to be connected for a software flow
    control connection
    """
    xonChar = models.IntegerField(max_length=2, default=17)
    xoffChar = models.IntegerField(max_length=2, default=19)

Мое представление берет данные из формы и вызывает вспомогательную функцию для получения пути и настроек машины.

Helper.py

def getMachineSettings(machine):
    from django.core.exceptions import ObjectDoesNotExist

    from src.apps.cnc.models import SoftwareFlowControlMachine, HardwareFlowControlMachine

    machineSettings = ""
    try:
        machineSettings = SoftwareFlowControlMachine.get(name_iexact='%s' % machine)
    except ObjectDoesNotExist:
        pass
    if machineSettings == "":
        try:
            machineSettings = HardwareFlowControlMachine.get(name_iexact='%s' % machine)
        except ObjectDoesNotExist:
            pass
    return machineSettings

Хотя это кажется глупым способом сделать это.Этот пост (ссылка) познакомил меня с сайтом djangosnippets.

Я смотрел на этот фрагмент , но я довольно слаб в том, чтобы увидеть, что все сходится вместе.

Правильно ли я понимаю, что если я добавлю наследовать ParentModel в мой SerialMachine absractКласс и создать ChildManager, который я мог бы просто сказать

machineSettings = SerialMachine.get(name_iexact'%s' % machine)

и из полей в унаследованных классах будет там для меня?

Большое спасибо за помощь и информацию, которую вы можете предоставить длямне

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

В зависимости от масштаба ваших потребностей может потребоваться сторонний пакет, такой как @yedpodtrzitko. Тем не менее, это может быть просто сделано без дополнительных механизмов, используя преимущества того, как Django обрабатывает MTI (множественное наследование таблиц). Каждый экземпляр SerialMachine будет иметь атрибут, названный в честь того, какой дочерний класс использовался для его создания. Исходя из этого, вы можете получить дочерний класс от родителя, просто проверив наличие атрибута:

class SerialMachine(models.Model):
    ...
    @property
    def child(self):
        if hasattr(self, 'hardwareflowcontrolmachine'):
            return self.hardwareflowcontrolmachine
        elif hasattr(self, 'softwareflowcontrolmachine'):
            return self.softwareflowcontrolmachine
        else:
            return None

Затем просто используйте machine.child там, где вам нужен конкретный тип машины. (Конечно, вы можете изменить имя атрибута на любое другое.

0 голосов
/ 21 февраля 2012

См. InheritanceManager в django-model-utils , возможно, он будет соответствовать вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...