我有一个这样的模型来存储应用程序的 GUI 数据:
class Application(models.Model):
name = models.CharField(max_length=80)
gui = models.ForeignKey(GuiPanel)
class GuiPanel(models.Model):
dimensions = models.CommaSeparatedIntegerField(max_length=16, help_text='Width,Height')
backgroundImage = models.ImageField(upload_to='guiImages/', blank=True)
class GuiComponent(models.Model):
guiPanel = models.ForeignKey(GuiPanel)
position = models.CommaSeparatedIntegerField(max_length=16) # x,y position
controlId = models.IntegerField(blank=True, null=True) # optional
class meta:
abstract = True
class RotaryDial(GuiComponent):
image = models.ImageField(upload_to='guiImages/')
angleRange = models.CommaSeparatedIntegerField(max_length=16, help_text='startAngle,endAngle')
valueRange = models.CommaSeparatedIntegerField(max_length=16, help_text='startVal,endVal)
class Toggle(GuiComponent): # we always just use 0 and 1 for its value
onImage = models.ImageField(upload_to='guiImages/')
offImage = models.ImageField(upload_to='guiImages/')
所以每个应用程序都有一个 GuiPanel,它有一个高度、宽度、一个背景图像,并且隐式有一组 GuiComponents(现在有两个子类,但将来可能会有更多)。
所以我可能会用它的所有 gui 数据来获取一个应用程序,如下所示:
Application.objects.prefetch_related('gui', 'gui__rotarydial_set', 'gui__toggle_set').get(pk=1)
这有点乏味,因为大约会有 6 个子类,我以后可能会添加更多。
或者,如果我为 GuiPanel 使用非抽象模型,我可以这样做:
Application.objects.prefetch_related('gui', 'gui__guicomponent_set').get(pk=1)
然后我可以通过使用 hasattr 来反省 guicomponent_set 中每个实例的实际子类。
首先,整体模型还可以还是可以改进?最后,在这种情况下,上面的哪个选项(抽象与非抽象)更好?