You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django外键关联联系电话无法在JSON视图展示的问题求助

解决方案:让JSON返回包含联系人的多个联系电话

看起来你已经搭好了联系人与电话的关联模型,但当前视图代码只返回了联系人的基础信息,没带上关联的联系电话——这是因为PhoneBook.objects.values()只会提取PhoneBook模型自身的字段数据,不会自动关联查询关联的ContactNumber记录。

我给你调整下views.py的代码,让它能返回包含多个联系电话的JSON数据:

from django.shortcuts import render
from .models import PhoneBook, ContactNumber
from django.http import JsonResponse
from django.views import View

class PhoneBookList(View):
    def get(self, request):
        # 预取关联的联系电话,避免循环查询数据库的性能问题
        phonebooks = PhoneBook.objects.prefetch_related('contact_numbers').all()
        phonebooklist = []
        
        for book in phonebooks:
            # 构造包含联系电话的字典
            book_data = {
                'id': book.id,
                'name': book.name,
                'address': book.address,
                'email': book.email,
                'note': book.note,
                # 提取当前联系人的所有联系电话
                'contact_numbers': [num.contact_number for num in book.contact_numbers.all()]
            }
            phonebooklist.append(book_data)
        
        return JsonResponse(phonebooklist, safe=False)

关键细节说明:

  • prefetch_related('contact_numbers'):这个方法会一次性把所有联系人的联系电话都查询出来,避免在循环里逐个查询数据库(也就是常说的N+1查询问题),能有效提升接口性能。
  • 手动构造字典:不再使用values(),而是逐个遍历联系人对象,把你在模型里定义的related_name(contact_numbers)对应的关联数据提取成字符串列表,添加到返回数据中。

另外给你提个小优化建议:你的ContactNumber模型里的外键字段命名number有点容易混淆,而且Django 3.0+要求外键必须指定on_delete参数,建议修改模型:

class ContactNumber(models.Model):
    # 把外键字段名改成更清晰的phone_book,同时加上必填的on_delete参数
    phone_book = models.ForeignKey(PhoneBook, related_name="contact_numbers", on_delete=models.CASCADE)
    contact_number = models.CharField(max_length=30)

    def __str__(self):
        return self.contact_number

修改完成后,请求接口就能得到每个联系人对应的多个联系电话了,返回的JSON结构大概是这样的:

[
    {
        "id": 1,
        "name": "张三",
        "address": "XX街道",
        "email": "zhangsan@example.com",
        "note": "朋友",
        "contact_numbers": ["138xxxx1234", "139xxxx5678"]
    }
]

内容的提问来源于stack exchange,提问作者bossajie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:23