【发布时间】: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)
并且从继承类中的字段中为我准备好了吗?
非常感谢您为我提供的帮助和信息
【问题讨论】:
-
不要称它为“帮手”。称之为“工厂”。人们更喜欢“工厂”的设计模式;它使工作明确。助手可以意味着任何东西。工厂意味着它创建子类对象。
-
谢谢先生,我会记住的
-
不记得了。解决您的问题。