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
相关产品推荐
相关产品推荐

