以下是我的情况:我想构建一个带有标记问题模型的QA系统。
我的型号代码是:
class Question(models.Model):
class Meta:
ordering = ['-create_time']
title = models.CharField(
verbose_name=_('标题'),
max_length=50
)
content = models.TextField(
verbose_name=_('内容'),
max_length=2000
)
tag = generic.GenericRelation(Tag)
class Tag(models.Model):
name = models.SlugField(_('tag'),max_length=10)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey("content_type", "object_id")
user = models.ForeignKey(User)
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
我的序列化器是:
class QuestionCreateSerializer(serializers.HyperlinkedModelSerializer):
tag = serializers.SlugRelatedField(many=True, slug_field='name')
class Meta:
model = Question
fields = ('title','content','tag')
我的观点是:
class QuestionList(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = QuestionCreateSerializer
然后我得到的是django-rest-framework的标准输出,当我访问我的api时(“/.... / api / questions /”)
当我想发布新问题时,我只能选择已存在的标签。
我想要的是客户可以随意发布带有标签列表的新问题。如果发布的标记项是现有标记项,则将其添加到问题中,否则,创建一个新标记以附加到问题。
那么,我可以将哪些逻辑添加到模型,序列化程序或视图中?
答案 0 :(得分:0)
之前我是如何为我的标签创建一个帖子视图,只是使用一个继承自APIView的视图。需要发送的数据是问题ID,以及用逗号分隔的一串单词。我检索问题对象,然后我在单词上调用python split,然后迭代获取或为每个标记创建一个新标记。然后我将问题添加到for循环中的每个标记。 与此相似的东西
class TagAPIView(APIView):
def post(self, request):
tags = request.DATA.get(u'tags', None)
question = request.DATA.get(u'question', None)
question = get_object_or_404(Question, id=question)
tags = tags.split(',')
for tag in tags:
tag = Tag.objects.get_or_create(name='tag')
tag.question_set.add(question)
return Response(status=status.HTTP_201_created)
这并不是你怎么做的,但这与我过去的做法非常相似。