【问题标题】:Proper Child class selection正确的子类选择
【发布时间】:2012-02-21 10:20:54
【问题描述】:

我在空闲时间学习 Django(和编程)。这很有趣,但我对如何在逻辑上区分共享父级的两个模型有疑问。

我想做的是有一个表格,我可以在其中输入一台机器和一个文件来发送它。我遇到的问题是我有两种类型的机器(它们是 RS-232 通信)这些机器具有硬件流控制或软件流控制。

我设置了一个 url /transmitProgram/ 来获取输入的表单数据并将其发送到正确的位置。我不知道如何选择正确的机器设置。

OfficeMachine 是硬件流控制机器,而 GarageMachine 是软件流控制机器

我在我的表单中发送文件 001 到 OfficeMachine(如何知道 OfficeMachine 是软件还是硬件)

模型.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

不过,这似乎是一种愚蠢的做法。这篇帖子 (link) 向我介绍了 djangosn-ps 网站。

我在看this snippet,但我看不到一切都融合在一起。

如果我在我的 SerialMachine 抽象类中添加继承 ParentModel 并创建一个我可以说的 ChildManager,我的理解是否正确

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

并且从继承类中的字段中为我准备好了吗?

非常感谢您为我提供的帮助和信息

【问题讨论】:

  • 不要称它为“帮手”。称之为“工厂”。人们更喜欢“工厂”的设计模式;它使工作明确。助手可以意味着任何东西。工厂意味着它创建子类对象。
  • 谢谢先生,我会记住的
  • 不记得了。解决您的问题。

标签: python django


【解决方案1】:

请参阅django-model-utils 中的 InheritanceManager,也许它会满足您的需求。

【讨论】:

    【解决方案2】:

    根据您的需求范围,可能需要使用第三方软件包,例如 @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。 (您当然可以将属性名称更改为您喜欢的任何名称。

    【讨论】:

    • 非常感谢,这看起来比我尝试过的要优雅得多
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多