2011-03-06 100 views
1

我開始學習Django的最近的,不能找到一個簡單的問題的答案。 我有2個表:客戶端和地址。Django的創建關係的一個一對多

------------------ 
CLIENT | 
------------------ 
ID | 
NAME | 
ADDRES_REF | 
------------------ 

------------------ 
ADDRES | 
------------------ 
ID | 
NAME | 
CITY | 
COLLECTION | 
------------------ 

它們之間的關係是:client.addres_ref = addres.collection。 爲了選擇客戶端的所有地址,ID爲123我要創建這樣的查詢:

select addres.name, addres.city from addres, client where client.addres_ref=addres.collection and client.id=123; 

當然它的更多鈔票來創建關係多到很多,但我不不會產生額外的表,它和變化表格的結構。

class Addres(models.Model):  
    address = models.CharField(max_length=150) 
    city = models.ForeignKey(City) 




class Client(models.Model): 
    addres   =models.ManyToMany(Addres)   
    email   =models.EmailField(blank=True) 
    name   =models.CharField(max_length=50) 

它是更多鈔票在ADDRES模型的ForeignKey添加(客戶端),但我需要從其他型號參考ADDRES太像用戶,僱主...... 請幫我創造與上文關係模型陳述表。

回答

2

我認爲你需要做的是使用的內容類型框架創建的模型ADDRES通用外鍵的東西。

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

class Addres(models.Model): 
    content_type = models.ForeignKey(ContentType, related_name='addresses') 
    object_id = models.IntegerField() 
    content_object = generic.GenericForeignKey() 

    address = models.CharField() 
    city = models.ForeignKey(City) 

class Client(models.Model): 
    addresses = generic.GenericRelation(Addres) 
    email = models.EmailField() 
    name = models.CharField() 

那麼客戶對象將使用client.addresses返回地址,或者您可以查詢ADDRES模式是這樣的:

client = Client.objects.get(pk=123) 
addresses = Addres.objects.filter(content_object=client) 

和ADDRES模型可以鏈接到其他型號爲好,如

class User(models.Model): 
    addresses = generic.GenericRelation(Addres) 
    name = models.CharField() 
3

這可能是有用的 - One to many。這是一個正式文件,所以沒有什麼特別的...

我不知道如果我理解正確的問題,但如果你將定義集合字段作爲外鍵的客戶端是什麼?那麼你應該可以做點像

address = Address.objects.get(collection=123) 
+0

他應該使用一個通用的外鍵,如果他希望能夠使用客戶端以外的模型的地址模型。同樣看問題(「爲了選擇所有地址」),似乎每個客戶端會有多個地址......您將使用「Addres.objects.filter(collection = 123)」來代替您的答案 – DTing 2011-03-06 13:18:19

+0

是的,好點:) – 2011-03-06 13:25:31