【问题标题】:Django: working with a multiple foreign key modelDjango:使用多个外键模型
【发布时间】:2011-12-03 09:36:26
【问题描述】:

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 时,我使用的是 Django Serializers 版本 1.1.0 的 Wad of Stuff。以下代码仅返回人员数据,但我需要人员以及相关的电话和地址。怎么了?

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

【问题讨论】:

    标签: django django-models foreign-keys models


    【解决方案1】:

    1) 没有。

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

    另请阅读select_related 的文档

    【讨论】:

    • 感谢您的帮助。但是phones = person.phone_set.all() 给了我以下错误:AttributeError: 'Person' object has no attribute 'phone_set' 这里有什么不同?
    • 我已经阅读了select_related,但我无法将其应用于我的情况。我可以用它从电话到人,但不能从更合乎逻辑的人到电话和地址。我错过了什么?
    • 阅读 Pep 8(下一次,如果您要询问拼写错误,请直接复制您的模型)影响反向关系的另一件事是外键声明中的“related_name”设置。
    【解决方案2】:

    1) 您应该能够使用它来获取此人及其电话/地址,因为它不是多对多关系:

    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 字典。我对一堆东西不熟悉,您可能想查看源代码以了解 serializers.serialize() 期望什么,以及哪些参数定义了您得到的内容。抱歉,我帮不上忙。

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 2017-06-01
      • 1970-01-01
      • 2015-01-29
      • 2020-11-26
      • 2023-01-26
      • 2012-03-16
      • 2020-08-27
      • 2015-04-22
      相关资源
      最近更新 更多