Django:使用多个外键模型

时间:2011-10-08 01:32:46

标签: django django-models foreign-keys models

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,Phone和Address这是最有效的方法吗?

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

2)当将此模型序列化为JSON时,我正在使用Wad of Stuff Django Serializers版本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 个答案:

答案 0 :(得分:2)

1)否。

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

另请阅读select_related

的文档

答案 1 :(得分:0)

1)您应该可以使用它来获取此人及其手机/地址,因为它不是ManyToMany关系:

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 of Stuff,您可能需要查看源代码以查看serializers.serialize()所期望的内容,以及哪些参数定义了您所获得的内容。对不起,我无法帮助那里。