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

Django Generic Views使用Serializer类时无法识别Model字段异常求解

AttributeError: Got AttributeError when attempting to get a value for field template_name on serializer ListJobTemplateSerializer.
The serializer field might be named incorrectly and not match any attribute or key on the Job instance.
Original exception text was: 'Job' object has no attribute 'template_name'.

异常触发原因

核心原因是你给绑定了JobTemplate模型的ListJobTemplateSerializer序列化器,传入了Job模型的实例/查询集作为数据源,Job模型本身就不存在template_name字段,直接触发属性不存在错误。
除此之外你的代码还有三个隐藏问题,即使修复数据源后也会报错:

  • JobTemplate模型的外键命名不符合语义:ForeignKey是多对一关联,单个JobTemplate只能关联一个Job,字段名设为复数jobs容易引发误用;同时related_name="%(class)s"的配置会导致Job实例反向查关联模板的属性名为jobtemplate,语义不清晰。
  • ListJobTemplateSerializer的job_title字段source配置错误:你写了source="name",但JobTemplate模型本身没有name字段,无法读取到关联Job的名称。
  • JobTemplate的__str__方法返回不存在的name属性,调用该方法时会直接报错。
解决办法

1. 修正视图层的数据源传入逻辑

确保传给ListJobTemplateSerializer的是JobTemplate类型的查询集/实例:

  • 如果要查询单个Job关联的所有模板,正确的查询集写法是JobTemplate.objects.filter(job=目标Job实例),不要直接把Job实例丢给序列化器。
  • 如果你需要在序列化Job的时候直接带出关联的模板列表,要单独给Job写嵌套序列化器,不能直接用ListJobTemplateSerializer序列化Job实例。

2. 修正模型和序列化器的错误配置

修正JobTemplate模型

class JobTemplate(Dates, ID):
    template_name = models.CharField(max_length=255)
    # 修改外键名和related_name,符合语义
    job = models.ForeignKey(to="jobs.Job", related_name="job_templates", on_delete=models.CASCADE)
    objects = BulkUpdateOrCreateQuerySet.as_manager()

    class Meta:
        db_table = 'job_template'

    # 修正返回字段为存在的template_name
    def __str__(self):
        return self.template_name

修正ListJobTemplateSerializer配置

class ListJobTemplateSerializer(serializers.ModelSerializer):
    """List all templates of a job."""
    # 修改source指向关联Job的name字段
    job_title = serializers.CharField(source="job.name")

    class Meta:
        model = JobTemplate
        fields = ["id", "job_title", "template_name"]

(可选)新增Job嵌套序列化器

如果需要序列化Job时直接带出关联的模板列表,新增以下序列化器:

class JobWithTemplatesSerializer(serializers.ModelSerializer):
    # 嵌套关联的模板序列化器
    job_templates = ListJobTemplateSerializer(many=True)
    class Meta:
        model = Job
        fields = ["id", "name", "is_remote", "company", "job_templates"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:27:03