我有一个类似于以下的模型,以支持每个人拥有多个电话号码和地址的能力:
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
答案 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()所期望的内容,以及哪些参数定义了您所获得的内容。对不起,我无法帮助那里。