/ files /

时间:2019-05-29 05:26:37

标签: python django python-3.x django-models django-rest-framework

当我要实现标签字段时,出现以下错误

  

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?有什么帮助吗?

1 个答案:

答案 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']