2

我对 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.

是否可以 ?

谢谢,

亚历克斯。

4

1 回答 1

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将是一个不错的选择。它允许您获取根容器或使用更有效的查询迭代框层次结构。我没有任何经验,但它确实似乎是最好的解决方案。

于 2013-04-26T14:29:23.157 回答