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 に答える