正确选择儿童班

2024-04-29 18:40:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在业余时间学习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)把我介绍到djangosnippets网站。你知道吗

我在看this snippet,但我看不到所有东西都在一起。你知道吗

如果我在SerialMachine abstract类中添加inherit ParentModel并创建一个ChildManager,我可以说

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

从继承类中的字段中可以找到我吗?你知道吗

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


Tags: 机器truedefault硬件软件modelsmachinelength
2条回答

请参阅django-model-utils中的InheritanceManager,也许它会满足您的需要。你知道吗

根据您的需求范围,可能需要第三方软件包,如@yedpodtrzitko suggest。但是,通过利用Django处理MTI(Multiple Table inheritation)的方式,这可以简单地完成,而不需要额外的机器。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。(当然,您可以将属性的名称更改为任何您喜欢的名称。你知道吗

相关问题 更多 >