2012-05-22 32 views
1

我拉着我的頭髮試圖解決這個(希望)簡單的問題。正確訪問Django-Nonrel中的OneToOneField關係中的派生類

我正在使用Django-Nonrel,並且正在嘗試設置一些模型。我已經簡化代碼如下:

class Application(models.Model) 
    name = "Application" 

    def get_name(self): 
     print(self.name) 

class ExampleApp(Application) 
    name = "Example Application" 

class Site(models.Model) 
    app = models.OneToOneField(Application, null=True) 
    id = models.CharField(max_length=1) 
    # other details not important 

當我獲得的Site一個例子,我想獲得派生類的一個實例(如ExampleApp

class MyView(View): 
    def get(self, request, *args, **kwargs): 
     # Presuppose that I have an object with id="a" 
     site = Site.objects.filter(id="a") 

     #<Application: Application> 
     app = site.app 

     #returns "Application", not "Example Application" 
     app.get_name() 

我怎樣才能訪問派生類?

(理想情況下,我想Application是一個抽象基類,不過在Django不允許抽象基類的關係。我會定義字段中Application,但Django的nonrel不支持多表繼承。 )

回答

1

Furbeenator的回答是正確的,但我覺得我的(自我)回答可能對我的情況更有價值。

Django-nonrel包括一些不錯的應用程序,值得注意的是djangotoolbox。包含在djangotoolbox是一個特定的字段,EmbeddedModelField。它似乎在「容器」模型中將模型的副本存儲爲blob。

在我的例子:

from djangotoolbox.fields import EmbeddedModelField 

class Site(models.Model) 
    app = EmbeddedModelField(null=True) 
    id = models.CharField(max_length=1) 
    # other details not important 

的上攻這是在我的情況下,這也意味着,我可以讓我的Application抽象類。缺點是數據現在被複制,而我仍然無法從Application實例訪問Site實例(但在我的情況中,這是一個可接受的折衷)。

2

這是不可能的,沒有額外的Django插件。請參閱Find object in child class from object in parent class in django,lazerscience的答案建議使用https://code.google.com/p/django-polymorphic-models/來訪問此功能。

+1

這當然*看起來像我感興趣的任何想法,這是否可以在Django nonrel? – NT3RP

+0

我還沒有嘗試過,但我會想象它可以與djanog-nonrel一起工作,這只是NoSQL的實現,這應該與NoSQL支持無關。 – Furbeenator

+1

該解決方案並不完全適用於當前情況。在涉及關係時,多態模型似乎沒有做任何特別的事情。另外,如果我將基類設置爲PolymorphicMetaClass,當我嘗試向下轉換時,會出現錯誤:'非關係數據庫不支持多表繼承。 – NT3RP