我的目标是为帖子添加标签。我正在使用最新的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)
答案 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)