在通过django-rest-framework创建新的标记对象时,如何添加新标记(GenericRelation字段)?

时间:2014-02-26 13:35:52

标签: django django-rest-framework

以下是我的情况:我想构建一个带有标记问题模型的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 /”)

当我想发布新问题时,我只能选择已存在的标签。

我想要的是客户可以随意发布带有标签列表的新问题。如果发布的标记项是现有标记项,则将其添加到问题中,否则,创建一个新标记以附加到问题。

那么,我可以将哪些逻辑添加到模型,序列化程序或视图中?

1 个答案:

答案 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)

这并不是你怎么做的,但这与我过去的做法非常相似。