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

Django DRF出现'ClassAssignment'无assignmentfileupload属性报错求解

报错原因及解决方案

你的报错核心是Django外键反向关联的默认命名规则不匹配,同时存在语法缩进问题:

  1. 外键反向关联名不匹配
    你在AssignmentFileUpload模型中定义了指向ClassAssignment的外键字段assignment,Django默认生成的反向关联名为模型名小写+_set,也就是assignmentfileupload_set,但你在序列化器中直接使用了assignmentfileupload作为字段名,ClassAssignment实例自然找不到这个属性,触发报错。
  2. 序列化器语法缩进错误
    你贴出的序列化器代码中,assignmentfileupload字段定义没有缩进在AssignmentSerializer类的作用域内,Python会将其识别为全局变量而非序列化器字段,即使关联名正确也无法正常工作。

修复方案(二选一即可)

方案1:调整序列化器字段名

直接使用Django默认生成的反向关联名,修改序列化器代码:

class AssignmentSerializer(serializers.ModelSerializer):
    # 缩进修正,字段名改为默认的反向关联名
    assignmentfileupload_set = serializers.HyperlinkedRelatedField(
        view_name='file_uploads',
        many=True,
        read_only=True
    )

    class Meta:
        model = ClassAssignment
        fields = (
            'id',
            'classroom',
            'title',
            'instructions',
            'due_date',
            'created_on',
            'assignmentfileupload_set' # 对应修改字段名
        )

方案2:自定义外键反向关联名

在AssignmentFileUpload模型的外键字段上添加related_name参数,指定你需要的反向关联名:

class AssignmentFileUpload(models.Model):
    # 添加related_name参数,指定反向关联名和你序列化器里的字段名一致
    assignment = models.ForeignKey(ClassAssignment, on_delete=models.CASCADE, related_name='assignmentfileupload')
    attachment = models.FileField(upload_to="assignment_uploads/")
    created_on = models.DateTimeField(default=datetime.now())

    def __str__(self) -> str : 
        return self.assignment.title

    def delete(self, *args, **kwargs) : 
        self.attachment.delete(save=False)
        return super().delete(*args, **kwargs)

同时修正序列化器的缩进问题即可正常运行。


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

相关产品推荐
方舟 Agent Plan

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

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