django中的通用相关集?

时间:2013-07-06 20:44:22

标签: django orm models

我有一个这样的模型用于存储应用程序的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中每个实例的实际子类。

首先,整体模型是好还是可以改进?最后,在这种情况下,上面哪个选项(抽象与非抽象)更好?

1 个答案:

答案 0 :(得分:0)

我认为最简洁的方法是没有抽象类。正如django文档中所建议的那样,你应该有一个基类表(带有基本属性)和一个每个派生类的表,其中包含基类的OneToOne键和派生类的属性。