2011-10-08 120 views
1

Django外鍵讓我瘋狂!我是Django的新手,我一直在研究一個解決方案,我知道這個解決方案必須是三個星期內沒有成功的簡單問題。我已經搜索了我的問題的答案,但很少有幫助。Django:使用多個外鍵模型

我有類似以下內容來支持每個人的有多個電話號碼和地址的能力模型:

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    <...> 

class Phone(models.Model): 
    person = models.ForeignKey(Person) 
    <...> 
    number = PhoneNumberField() 

class Address(models.Model): 
    person = models.ForeignKey(Person) 
    <...> 
    zipcode = models.CharField(max_length=10) 

我有兩個問題:

1)當加入的人,電話,和地址是最有效的方式嗎?

person = Person.objects.get(pk=1) 
phone = Phone.objects.get(person=person) 
address = Address.objects.get(person=person) 

2)當將這個模型序列化到JSON時,我使用了Stuff Django序列化器的版本1.1.0。以下代碼僅返回Person數據,但我需要Person和相關的Phone和Address。哪裏不對?

print serializers.serialize('json', Person.objects.all(), indent=4, relations=('phone', 'address',)) 

非常感謝你給予的任何幫助!

編輯:爲了澄清,我相信我不能複製以下使用Django的ORM是我的問題(或誤解)根:

select * from person 
    left join phone 
     on phone.person_id = person.id 
    left join address 
     on address.person_id = person.id 
    where person.id = 1 

回答

2

1)號

person = Person.objects.get(pk=1) 
phones = person.phone_set.all() 
addresses = person.address_set.all() 

另請閱讀文檔select_related

+0

謝謝你的幫助。但 '手機= person.phone_set.all()' 給了我以下錯誤: 'AttributeError的: '人' 對象有沒有屬性「phone_set'' 什麼不同嗎? – FlashBIOS

+0

我讀過[select_related](https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related),但我無法將其應用於我的情況。我可以用它來從電話到人,但不是從更合理的人到電話和地址。我錯過了什麼? – FlashBIOS

+0

閱讀Pep 8(下次,如果您打算詢問打字錯誤,請直接複製模型) 影響反向關係的另一件事是外鍵聲明中的「related_name」設置。 –

0

1)您應該可以使用此功能獲取人員和他的電話/地址的SSE,因爲它不是一個多對多的關係:

person = Person.objects.get(id=1) 
phones = Phone.objects.filter(person__id=person.id) 
addresses = Address.objects.filter(person__id=person.id) 

這裏最重要的是,你不想使用get()如果返回多個記錄它會拋出一個錯誤。 Get()用於獲取單個記錄,filter()用於多個記錄。

2)我不確定在這裏,但您可能需要爲您的個人,電話和地址使用單獨的JSON字典。我不熟悉WAD的東西,你可能想看看源代碼,看看serializers.serialize()期待什麼,以及哪些參數正在定義你所得到的。對不起,我不能在那裏幫忙。

+1

謝謝。 .filter()就像一個魅力。 – FlashBIOS