Django-Rest:Serialising ListField() - '_TaggableManager'对象不可迭代

时间:2018-03-11 19:50:33

标签: python django django-rest-framework

我的目标是为帖子添加标签。我正在使用最新的taggit(要求:Django-Taggit https://github.com/alex/django-taggit)和DRF。

目标:仅从已发布的请求中弹出tags。对于post请求中的每个标记,可以调用post.tags.add("tag1","tag2")将这些标记添加到模型中。

目前,我的帖子序列化器是:

class PostSerializer(serializers.ModelSerializer):
    tags = serializers.ListField(
        child=serializers.CharField(min_length=0, max_length=30)
    )
    ...

    def create(self, validated_data):
        pub.set_trace()

        tags_data = validated_data.pop('tags') # Need to pop tags only
        # to_be_tagged, validated_data = self._pop_tags(validated_data)
        images_data = self.context.get('view').request.FILES
        post = Post.objects.create(**validated_data)
        post.tags.add(*tags_data)
        for image_data in images_data.values():
            PostImage.objects.create(post=post, image=image_data)
        return post

当我发送包含以下数据的帖子请求时:

data = { 'title': 'First Post',
         ...
         'tags':'["tag1"]'}

我收到错误:

  

异常值:'_ TaggableManager'对象不可迭代

我还尝试发送'tags':'one, two, three'并简单one

编辑 - PDB输出:

Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
> /Users/gr/Desktop/PycharmProjects/godo/api/serializers.py(112)create()
-> tags_data = validated_data.pop('tags')
(Pdb) tags_data
*** NameError: name 'tags_data' is not defined
(Pdb) 

Models.py

from taggit.managers import TaggableManager

class Post(models.Model):
    objects = LocationManager() # to sort by distance
    tags = TaggableManager()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=False)
    description = models.TextField(max_length=500, blank=False)


    def __str__(self):
        return '{}'.format(self.title)

1 个答案:

答案 0 :(得分:0)

您确定tags_data变量的内容吗?你能把它追溯并调试它(参见:使用(i)pdb进行调试)?

我认为错误就是这些问题: post.tags.add(tags_data) 我们试试吧: post.tags.add(*tags_data)

明星解包列表。请参阅以下答案以供参考:https://stackoverflow.com/a/4959580/953553

在我的项目中,我处理模型M2M和序列化器中的tags我决定使用这种方法:

tags = serializers.SlugRelatedField(
    many=True,
    queryset=Tag.objects.all(),
    slug_field='text'
)

我的模特:

class Spot(models.Model):
    tags = models.ManyToManyField(Tag, related_name='spot_facilities', null=True, blank=True)


class Tag(models.Model):
    text = models.CharField(max_length=100, unique=True)