我目前正在开玩笑说如何使用 Django 建模。基本情况是我有一个对象应该作为 achassis
并提供一些sockets
. 然后有很多不同modules
的东西放在sockets
a上chassis
。我想modules
在 Django 中将这些不同的类建模为不同的类,但在数据库层使用一个公共类,可能涉及一些通用字段。
所以数据库模型可能看起来像这样:
class Module(models.model):
name = models.CharField(max_length=128)
# Or is there a better way to annotate a type?
type = models.CharField(max_length=128)
string1 = models.CharField(max_length=128)
string2 = models.CharField(max_length=128)
...
int1 = models.IntegerField()
# Some kind of engine class that derives from Module
# but does nothing else then "mapping" the generic
# fields to something sensible
class Socket(models.Model):
is_on = models.ForeignKey(Chassis)
name = models.CharField(max_length=128)
type = models.CharField(max_length=128)
class Connection(models.Model):
chassis = models.ForeignKey(Chassis)
module = models.ForeignKey(Module)
via = models.ForeignKey(Socket)
class Chassis(models.Model):
name = models.CharField(max_length=128)
modules= models.ManyToManyField(Module, through='Connection')
class Group(models.Model):
name = models.CharField(max_length=128)
当然,我不想用这种非规范化破坏我的逻辑。这就是为什么我暗示某种engine
应该使用 Module 表的类,但提供“逻辑”getter 和 setter,有效地将“Horsepower”等数据映射到“int1”。
所以我的问题基本上是:
- 我对 Django 所做的事情是否合理?还是有更好的(可能是内置的)方法来处理这个问题?
- 是否可以根据
Module.type
字段自动构建正确的类型,即为非规范化模型提供包装器方法的类型?