Django模型继承和Meta类

时间:2013-04-26 13:26:13

标签: django inheritance metaclass

我的django模型继承存在问题。这就是我所拥有的:

class Room(models.Model):
    name = models.CharField(max_length=32)

class Container(models.Model):
    size = models.IntegerField(default=10)
    ...

class BigBox(Container):
    room = models.ForeignKey(Room)
    ...

class SmallBox(Container):
    big_box = models.ForeignKey(BigBox)
    ...

class Stuff(models.Model):
    container = models.ForeignKey(Container)
    ...

    class Meta:
        ordering = ('container__???__name',)

所以,有了这个,我可以将一些东西放在大盒子里或放在大盒子里的小盒子里。

如何才能知道我的东西字段'容器'的类型,以便访问房间的名称?我知道我可以写

container__big_box__room__name 

container__room__name

但我想要像

这样的东西
container__get_room__name.

有可能吗?

谢谢,

亚历。

1 个答案:

答案 0 :(得分:0)

关于排序元的实际问题,我的答案是:我认为不可能。

现在,一些解决方法:

我会重新考虑您的模型层次结构。 对我来说,一个盒子/容器可以装在另一个盒子/容器中,但它仍然是一个盒子。

看看这个替代方案:

class Container(models.Model):
    size = models.IntegerField(default=10)
    room = models.ForeignKey(Room)
    ...

class ContainableContainer(Container):
    parent_container = models.ForeignKey('self', null=True)
    ...

class Stuff(models.Model):
    container = models.ForeignKey(Container)
    ...

    class Meta:
        ordering = ('container__room__name',)

使用这个解决方案,你真的不需要一个不同的模型,它们都是容器,其中一个投币器的容器是可选的。所以,你可以按照你的想法进行排序。

您必须小心房间现场管理。您需要使每个包含的容器室与其容器的房间相等。

例如,覆盖save方法或使用pre_save信号:

class ContainableContainer(Container):
        parent_container = models.ForeignKey('self', null=True)
        ...

    def save(self, *args, **kwargs):
        self.room = self.parent_container.room
        super(ContainableContainer, self).save(*args, **kwargs)

编辑:这实际上是一个树状的层次结构。为了提高查询效率,django-mptt将是一个不错的选择。 它允许您获取根容器或使用更高效的查询迭代框架层次结构。 我没有任何经验,但它似乎是最好的解决方案。