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