2013-04-26 104 views
2

我有一個django模型繼承的問題。這是我有:Django模型繼承和Meta類

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. 

這可能嗎?

謝謝,

Alex。

回答

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',) 

有了這個解決方案,你並不真的需要一個不同的模型,它們都是容器,其中cointainer的cointainer是可選的。所以,你可以按照你的想法進行排序。

你必須小心房間現場管理。您需要使每個包含的集裝箱房間與其集裝箱的房間相同。

例如,重寫保存方法或使用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) 

EDIT:這實際上是樹狀層次結構。爲了使它更高效的查詢django-mptt將是一個不錯的選擇。 它允許您獲取根容器或使用更有效的查詢遍歷盒層次結構。 我沒有任何經驗,但它確實是最好的解決方案。

+0

我不明白我的small_box可能在不同的房間,她的big_box,因爲small_box鏈接到一個特定的big_box。 你的層次結構非常酷,但是,我的small_box必須是一個大的。我希望這是由數據庫保存,而不是保存方法。 我希望我很清楚,謝謝你,並問我如果你想要一些精度的問題。 Alex。 – Alex 2013-04-26 14:38:37

+0

@亞歷克斯對不起。我對不同房間的反思是錯誤的。我的建議層次結構實際上就是這種情況。這具有冗餘字段的缺點,因爲每個ContainableContainer都會有一個指向其根目錄房間的字段。 – 2013-04-26 14:45:10

+0

沒問題;)是的,這是我第一次嘗試,並且如您所做的那樣,我忽略了保存方法。但是我的實習導師會更喜歡這個由數據庫來處理。實際上,實際的問題是:是否有一種方法可以在字段排序中使用函數,例如ordering =('box__get_room()__ name'))?我在這個問題上沒有找到任何東西,所以可能不是。我會和我的導師重新考慮你的方法,也許我會在星期一帶着好消息回來;)謝謝你的時間,祝你有美好的一天。 – Alex 2013-04-26 14:52:05