Django如何通过外键查询获取父模型股东的关联字段数据
问题修复方案
错误原因梳理
- 模型定义错误:
Question模型中的shareholder_IC外键关联的Shareholders_Meeting模型不存在,你实际定义的股东模型名为Shareholders - 属性调用错误:你设置的
related_name='shareholder_ic'是反向关联属性名,用于从Shareholders实例反向查询关联的Question列表,正向从Question访问关联股东应该用外键字段本身的名称shareholder_IC - 额外优化点:你当前的查询方式会触发N+1查询问题,建议用
select_related提前联表查询关联的股东数据
修复步骤
第一步:修正Question模型定义
class Question(models.Model): question_ID = models.AutoField(primary_key=True) question = models.CharField(max_length=400, null=True) meeting_id = models.ForeignKey(Meeting, on_delete=CASCADE) # 修改关联模型为Shareholders,related_name可以根据需求自定义 shareholder_IC = models.ForeignKey(Shareholders, on_delete=CASCADE, related_name='questions_from_shareholder') date_created = models.DateTimeField(default=timezone.now, null=True) def __str__(self): return str(self.meeting_id)
修改完成后执行makemigrations和migrate命令同步数据库结构。
第二步:修正视图查询逻辑
用select_related联表查询,直接在values中指定需要返回的关联股东字段即可:
def getMessages(response, meeting_id): questions = Question.objects.filter(meeting_id=meeting_id).select_related('shareholder_IC').values( 'question_ID', 'question', 'meeting_id', 'shareholder_IC', 'date_created', # 直接取关联的Shareholders表字段 'shareholder_IC__sharehold_name', 'shareholder_IC__sharehold_email' ) # 转换为你期望的返回字段格式 res = [] for q in questions: res.append({ 'question_ID': q['question_ID'], 'question': q['question'], 'meeting_id_id': q['meeting_id'], 'shareholder_IC_id': q['shareholder_IC'], 'date_created': q['date_created'], 'sharehold_name': q['shareholder_IC__sharehold_name'], 'sharehold_email': q['shareholder_IC__sharehold_email'] }) return JsonResponse({"questions": res})
如果你使用Django 3.2及以上版本,可以直接在values中使用F表达式给字段起别名,省去手动转换的步骤:values(sharehold_name=F('shareholder_IC__sharehold_name'))。
内容的提问来源于stack exchange,提问作者azril
相关产品推荐
相关产品推荐

