当我要实现标签字段时,出现以下错误
AttributeError:尝试在序列化程序
tags
上获取字段CategorySerializers
的值时,出现AttributeError。 序列化程序字段的名称可能不正确,并且与Category
实例上的任何属性或键都不匹配。 原始异常文本为:“类别”对象没有属性“标签”。
models.py
class Category(models.Model):
name = models.CharField(max_length=100)
class Tag(models.Model):
tag_name = models.CharField(max_length=30)
class FileUp(models.Model):
name = models.ForeignKey(Category, on_delete=models.CASCADE)
file = models.FileField(upload_to='path')
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.name.name
serializers.py
class TagSerializers(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['tag_name']
class FileSerializers(serializers.ModelSerializer):
class Meta:
model = FileUp
fields = ['file']
class CategorySerializers(serializers.HyperlinkedModelSerializer):
files = FileSerializers(source='file_set', many=True, read_only=True)
tags = TagSerializers(many=True)
class Meta:
model = Category
fields = ['id', 'name', 'files', 'tags']
read_only_fields = ['tags']
def create(self, validated_data):
files_data = self.context.get('view').request.FILES
name = Category.objects.create(name=validated_data.get('name'))
for file_data in files_data.values():
FileUp.objects.create(name=name, file=file_data)
return name
这是我尝试过的方法,我已经将标签放入类别模型中,但是当我要添加文件时,我无法为其添加标签或在管理员中选择标签面板。但是,如果我将Tag添加到FileUp,则会收到上面显示的错误消息。如何将标签应用于FileUp?有什么帮助吗?
答案 0 :(得分:1)
使用 SerializerMethodField
参数
class CategorySerializers(serializers.HyperlinkedModelSerializer):
files = FileSerializers(source='file_set', many=True, read_only=True)
tags = serializers.SerializerMethodField()
def get_tags(self, category):
return TagSerializers(Tag.objects.filter(fileup__name__categories=category), many=True).data
class Meta:
model = Category
fields = ['id', 'name', 'files', 'tags']
read_only_fields = ['tags']