2011-04-27 58 views
0

我只是需要一點點的幫助來思考這一點,如果有人可以如此善良。Django多個字段之間的聯繫

class object_a(models.Model): 
    foo = models.blah 
    bar = models.blah 

class object_b(models.Model): 
    foop = models.blah 
    barp = models.blah 

在另一種模式,我有我想有兩個字段一個關係類。例如,在管理員中,我想要一個可在某種關係中選擇的object_a和object_b對象的列表。

我知道某種通用關係可以做到這一點,我只是不能完全達到儘管。所有的幫助表示讚賞。

謝謝。

回答

3

使用Django提供的contenttypes framework

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class Other(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

然後你就可以創建一些你的主要對象:

>>> from myapp.models import object_a, object_b, Other 
>>> a = object_a() 
>>> a.foo = 'test' 
>>> a.bar = 'value' 
>>> a.save() 
>>> b = object_b() 
>>> b.foop = 'random' 
>>> b.barp = 'values' 
>>> b.save() 

然後保存在Other對象對它們的引用:

>>> o1 = Other() 
>>> o1.content_object = a 
>>> o1.save() 
>>> o2 = Other() 
>>> o2.content_object = b 
>>> o2.save() 

現在如果我們要求所有的Other o bjects並檢查他們:

>>> all = Other.objects.all() 
>>> all[0].content_object 
<object_a: object_a object> 
>>> all[0].content_object.foo 
u'test' 
>>> all[1].content_object 
<object_b: object_b object> 
>>> all[1].content_object.foop 
u'random' 

通過查看Other對象的領域,我們可以看到Django是如何存儲的一般關係:

>>> all[0].content_type 
<ContentType: object_a> 
>>> all[0].object_id 
1 

當您運行syncdb命令來安裝你的模型, Django爲每個模型創建一個唯一的ContentType對象。在使用泛型關係時,將外鍵存儲到此內容類型條目(標識關係的另一端是什麼類型的對象)以及模型實例的唯一標識。 generic.GenericForeignKey字段沒有存儲在數據庫中,而是一個包含內容類型和對象ID併爲您檢索實際對象的包裝器。

+0

嗨布萊爾,這當然清除了如何在API中做到這一點。在總體意義上來看。但是有沒有辦法在管理員中表示這種類型或關係?再次感謝。 – jduncan 2011-04-27 13:32:08

+0

看着http://docs.djangoproject.com/en/dev/ref/contrib/admin/#using-generic-relations-as-an-inline,我需要(或至少渴望)與此相反的管理員。我基本上需要一個由object_a和object_b中的對象內容組成的foreignkey字段 – jduncan 2011-04-27 14:04:00

相關問題