2011-03-23 139 views
0

好的我知道標題聽起來很混亂,但它確實很簡單。考慮到這一點:擴展Django模型類(m2m)2級別

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A) 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 

所以,現在我想要的是擴展與其他領域的所有實例。例如,對於通過B可用的每個A實例,我需要一個與其相關的整數。

有沒有一個簡單的方法來做到這一點?

編輯:

我覺得我們可以看到這是從C到情況下在B A的一個一對多關係的定義,如果是有道理的......

+0

可能實例的,在連接到B&C同一時間? – manji 2011-03-23 14:11:00

+0

不是真的,這就是爲什麼我有這個問題...這是模型的簡化版本。實際上,我在B類中有更多的外鍵(主要是一對多)。因此,B是一切收集點,如配置文件定義。儘管在所有這些外鍵中只有一個需要像這樣擴展。 – rytis 2011-03-23 14:18:54

回答

0

如果您需要擴展A的所有實例與另一個字段,添加另一個字段。

對於您需要每個A到B的字段的示例場景,請使用直通模型。

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

class A(models.Model): 
    field = models.CharField(max_length=10) 

class B(models.Model): 
    field = models.CharField(max_length=10) 
    a_elements = models.ManyToManyField(A, through='B_A') 

class C(models.Model): 
    field = models.CharField(max_length=10) 
    b_element = models.ForeignKey(A) 


class B_A(models.Model): 
    """ 
    Custom through model for B.a_elements 
    """ 
    a = models.ForeignKey(A) 
    b = models.ForeignKey(B) 
    integer = models.IntegerField() 


b = B.objects.latest('id') 
ab_elements = B_A.objects.filter(b=b).select_related() 
# these are your m2m intermediary model instances, 
# which are essentially A instances with an extra field. 

for ab in ab_elemements: 
    print ab.a # a element 
    print ab.integer # integer associated with this a element. 

通過你的問題的標題,我想你問一個關於C的問題,但(你沒有提到)

+0

抱歉,如果問題很混亂,我只是很難制定它。但是,是的,這是關於C. B不需要添加額外的信息,這是C需要這個額外的信息。 – rytis 2011-03-23 15:02:11

+0

因此,我認爲C是不常見的,你想分開C-B-A數據?如果您需要每個C - A實例之間的數據,那麼您唯一的選擇是來自C - A的另一個m2m字段,某個標準化字段存儲'b.a_elements.all()'id和它們的關聯值,或者' B.a_elements.through' – 2011-03-23 15:52:52

+0

是的,就像那樣,雖然我沒有看到這種方式告訴Django ...只有解決方案,我想出了:D類,有這個額外的領域,然後從CI做一對多到這個新的類D. D類實例自動創建,當C啓動時(因爲那時我知道我需要多少)。缺點是我不能(很容易)從A看到所有相關的D實例...... – rytis 2011-03-24 07:00:57