Django-Rest-Frameworkを介して新しいタグオブジェクトを作成するときに、新しいタグ(GenericRelationフィールド)を追加する方法

StackOverflow https://stackoverflow.com//questions/22043057

  •  21-12-2019
  •  | 
  •  

質問

これは私の状況です:タグ付き質問モデルを使用して、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
.

それで私が得たのは、私のAPI( "/.. //api /")にアクセスするとき、Django-Rest-Frameworkの標準的な出力です( "/../api /")

新しい質問を投稿したいときは、すでに存在するタグを選択できます。

私が欲しいのは、クライアントは新しい質問を好きなものであれば、新しい質問をタグのリストに投稿することができます。そして、投稿されたタグ項目が存在している場合は、問題に追加して、質問に添付する新しいタグを作成します。

SO、どのロジックでモデル、シリアライザ、またはビューに追加できますか?

役に立ちましたか?

解決

Apiviewから継承するビューを使用して、タグの投稿ビューを作成することを行う方法。送信する必要があるデータは、質問ID、およびカンマで区切られた単語の文字列です。私は質問オブジェクトを取得し、それから私は単語のPython分割を呼び出してから、各トークンの新しいタグを取得または作成するかを繰り返します。それから私は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)
.

これはあなたがそれをどのようにするか正確にはそうではありませんが、これは私が過去にそれをした方法と非常によく似ています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top