Django DRF出现'ClassAssignment'无assignmentfileupload属性报错求解
报错原因及解决方案
你的报错核心是Django外键反向关联的默认命名规则不匹配,同时存在语法缩进问题:
- 外键反向关联名不匹配
你在AssignmentFileUpload模型中定义了指向ClassAssignment的外键字段assignment,Django默认生成的反向关联名为模型名小写+_set,也就是assignmentfileupload_set,但你在序列化器中直接使用了assignmentfileupload作为字段名,ClassAssignment实例自然找不到这个属性,触发报错。 - 序列化器语法缩进错误
你贴出的序列化器代码中,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
相关产品推荐
相关产品推荐

