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

Django外键关联模型序列化器问题:无法获取评论与文件数据

问题解决步骤

1. 匹配序列化器字段与模型related_name

模型中外键的related_name是关联查询的核心标识,序列化器必须使用该名称作为关联字段名,否则无法拉取对应数据:

  • Files模型关联Site的related_name是site_name,需将Site序列化器中的attachment改为site_name
  • Comment模型关联Site的related_name是site_name_comment,需将Site序列化器中的remarks改为site_name_comment

2. 修正Site序列化器的拼写错误

Site序列化器Meta类中的fileds是拼写错误,正确应为fields——拼写错误会导致自定义的关联字段无法被纳入序列化结果。

3. 可选:完善评论的嵌套回复序列化

如果需要展示评论的层级回复结构,需在CommentSerializer中添加嵌套序列化逻辑。


修正后的完整代码示例

models.py(确认related_name,补充必要字段)

from django.db import models
from django.contrib.auth.models import User
import datetime

class Site(models.Model):
    site = models.CharField(max_length=30, blank=False, null=False)
    approver = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name="design_site_approver", blank=True, null=True)
    submitter = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name="design_site_submitter", blank=True, null=True)

class Files(models.Model):
    site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name='site_name')
    file = models.FileField(upload_to='site_attachments/')  # 补充文件字段,原代码缺失

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_name_comment')
    timestamp = models.DateTimeField(default=datetime.datetime.now)
    remarks = models.TextField(null=True, blank=True)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='replies')
    site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name='site_name_comment')

serializers.py(修正字段名与拼写,添加回复嵌套)

from rest_framework import serializers
from .models import Site, Files, Comment

class CommentSerializer(serializers.ModelSerializer):
    # 实现评论回复的嵌套序列化
    replies = serializers.SerializerMethodField()

    def get_replies(self, obj):
        if obj.replies.exists():
            return CommentSerializer(obj.replies.all(), many=True).data
        return []

    class Meta:
        model = Comment
        fields = '__all__'

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Files
        fields = '__all__'

class SiteSerializer(serializers.ModelSerializer):
    # 使用模型定义的related_name作为关联字段名
    site_name_comment = CommentSerializer(many=True, read_only=True)
    site_name = FileSerializer(many=True, read_only=True)

    class Meta:
        model = Site
        fields = '__all__'  # 修正拼写错误

额外优化建议

  • 可修改模型的related_name为更直观的名称,比如将Files的site_name改为attachments,Comment的site_name_comment改为comments,对应序列化器字段名同步调整即可提升可读性。
  • 查询Site数据时使用prefetch_related优化性能,避免N+1查询:
    # 视图查询示例
    sites = Site.objects.prefetch_related('site_name_comment', 'site_name').all()
    serializer = SiteSerializer(sites, many=True)
    return Response(serializer.data)
    

内容的提问来源于stack exchange,提问作者Pratik das baghel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:54