Nerd
Nerd

Reputation: 275

AttributeError at /files/

when I am going to implement tag field I am getting following error

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

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

here is what I tried, I have put Tag in Category model but when I am going to add files I cannot add tags to it or select tags in the admin panel. But, If I add Tag to FileUp I am getting error above shown. How can I apply to Tag to FileUp? any help please?

Upvotes: 0

Views: 71

Answers (1)

JPG
JPG

Reputation: 88429

Use SerializerMethodField parameter,

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

Upvotes: 1

Related Questions