2013-02-28 91 views
1

所以我用在Django與下面的類繼承:Django的objects.all查詢集不從數據庫返回的所有對象

class main_menu(node): 
    """ 
    main_menu(node) 

    Has no extra fields. All children of the root node must 
    be main_menu nodes 
    """ 
    # Required for tree hierarchy to work (db_column='path' for raw queries) 
    _path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    main_menu_blah = models.CharField(max_length=30, default=''); 

    def __unicode__(self): 
     return self.main_menu_blah; 

MAIN_MENU

class language(main_menu): 
    """ 
    language(main_menu) 

    Main menu used specifically for a main menu targetted 
    at a speaker of some language. 
    """ 
    # Required for tree hierarchy to work 
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    language_blah = models.CharField(max_length=30, default=''); 

    def __unicode__(self): 
     return self.language_blah; 

語言

class language2(language): 
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    language_blah2 = models.CharField(max_length=30, default=''); 

現在,我可以插入訪問所有這些模型就好。我也可以使用.objects.get(...)來獲取它們。

但是,如果我從父類表中刪除一行(例如語言是language2的父語言),那麼我無法從language2表中獲取()最後一行。我執行 subNode = language2.objects.get(_path3 =);

我總是得到以下錯誤:

DoesNotExist

LANGUAGE2匹配查詢不存在的。

我查看了數據庫(sqlite),我可以看到最後一個條目在列_path3中。此外,我可以使用原始查詢(使用connection.cursor()),我可以得到最後一行。但它只是原始數據,我需要一個模型對象。哦,並使用.extra()也沒有工作。

爲什麼我不能得到最後一行? (直到我重新啓動服務器)

謝謝。

編輯: 其他的東西需要不同的「_path *」變量,所以抽象基類對我來說沒有幫助,但這是另一個話題。

至於db_column ='路徑',我這樣說,以便原始查詢更精簡,我試圖刪除它(以便該列是「_path1」,「_path2」等),但問題依然存在。最令人困惑的部分是原始查詢起作用,並且重新啓動服務器修復它(直到插入新行,然後纔看到最後一行)。

EDIT2: 所以我才發現了所發生的事情。我忘記的重要的事情是每張桌子如何結合在一起。

如果我有一個基類: A類

甲亞類: B類(A)

另一亞類中: C類(B)

我有表的鏈接,像這樣:

A - >乙 - 「ç

可以說我有在每個表2點的行(每個O ne代表該類的一個實例):

第1列A:Name =「Gerald」 - > B:Age =「25」 - > C:Gender =「Male」 row 2 A:Name =「Janet」 - > B:Age =「24」 - > C:Gender =「Female」

如果表B中的第二行被刪除,則指向表C的鏈接中斷 所以我基本上切碎了班級的軀幹。 1/3的數據丟失。所以,Django報告它不存在。

因此,請務必在手動刪除條目時小心。你不應該與Django的這個問題,因爲它應該跟蹤你的所有。

回答

0

我注意到的第一件事是您有兩個模型從其他類繼承並添加它們自己的字段,但它們使用相同的db_column。實現這一目標的一種更簡潔的方法(如果您不直接使用main_menu)是Abstract Base Class

實際上,你language2模式有以下字段:

_path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    main_menu_blah = models.CharField(max_length=30, default='') 
    language_blah = models.CharField(max_length=30, default='') 
    language_blah2 = models.CharField(max_length=30, default='') 

而且,Python並不需要在每個語句的結束分號。

相關問題