2012-02-21 3 views
1

저는 자유 시간에 장고 (및 프로그래밍)를 배우고 있습니다. 재미 있지만 부모를 공유하는 두 모델을 논리적으로 구분하는 방법에 문제가 있습니다.적절한 하위 클래스 선택

내가하고 싶은 것은 컴퓨터와 파일을 입력 할 수있는 양식을 작성하는 것입니다. 내가 가지고있는 문제는 두 가지 유형의 기계 (RS-232 통신)입니다.이 기계에는 하드웨어 흐름 제어 또는 소프트웨어 흐름 제어가 있습니다.

url/transmitProgram /을 입력하여 양식 데이터를 가져 와서 적절한 위치로 보내도록 설정했습니다. 올바른 컴퓨터 설정을 선택하는 방법을 모르겠습니다.

OfficeMachine 하드웨어 흐름 제어 기계 및 GarageMachine 소프트웨어 흐름이

내가

Models.py을 (OfficeMachine 소프트웨어 또는 하드웨어 인 경우 방법을 알고) OfficeMachine에 파일 001를 보내 내 양식을 보내

제어입니다

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 

이건 그냥하지만 ​​그것을 할 수있는 바보 같은 방법처럼 보인다. 이 게시물 (link)은 나를 djangosnippets 웹 사이트에 소개했습니다.

나는 this snippet을보고 있었지만, 나는 모든 것이 맞아 떨어지는 것을보기에는 꽤 약하다.

내가 이해 정정 오전 내 SerialMachine absract 클래스 ParentModel을 상속 난 그냥 상속 된 클래스에서

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

과 필드에서 나를 위해있을 것입니다 말할 수있는 ChildManager을 만들 추가하면?

덕분에 당신이 나를

+2

"도우미"라고 부르지 말고 "공장"이라고 말하면 사람들은 "공장"디자인 패턴에 더 익숙해집니다. 도우미는 무엇이든 의미 할 수 있습니다. 팩토리는 하위 클래스 객체를 만듭니다. –

+0

고마워요. – Dan

+0

기억하지 마십시오. 질문 수정. –

답변

0

참조 InheritanceManager에 대한 django-model-utils에 제공 할 수있는 도움과 정보를 많이, 어쩌면 것입니다 귀하의 요구에 적합합니다.

0

요구 사항의 범위에 따라 @yedpodtrzitko와 같은 타사 패키지가 필요할 수도 있습니다. 그러나 이것은 Django가 MTI (Multiple Table Inheritance)를 처리하는 방식을 이용함으로써 추가 기계 없이도 간단히 수행 할 수 있습니다. 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

대단히 감사합니다. 시도했다 – Dan