我是django的初学者,是DRF的新手。因此,问题出在嵌套序列化程序的create()方法中。事实是,它创建了新的标签实例,但没有将它们附加到我想在POST请求中发送到服务器的问题实例上。
这是我的模型:
class Question(models.Model):
title = models.CharField(max_length=100)
content = models.CharField(max_length=500, default="Write your question") # HTMLField() look TinyMCE
tags = models.ManyToManyField("Tag")
pub_date = models.DateField(auto_now=False, auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
answers = models.ManyToManyField("Answer")
comment_cnt = models.IntegerField(default=0)
like_cnt = models.IntegerField(default=0)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('questions', args=[self.title])
class Meta:
ordering = ['pub_date']
class Answer(models.Model):
content = models.CharField(max_length=500, default="Write the answer") # HTMLField() look TinyMCE
pub_date = models.DateField(auto_now=False, auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
like_cnt = models.IntegerField(default=0)
def __str__(self):
return self.author.username
class Tag(models.Model):
name = models.CharField(max_length=50)
discription = models.CharField(max_length=500, default="This is description")
use_cnt = models.IntegerField(default=0)
def __str__(self):
return self.name
这是序列化器:
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = '__all__'
read_only_fields = ['use_cnt']
class AnswerSerializer(serializers.ModelSerializer):
class Meta:
model = Answer
fields = '__all__'
class QuestionSerializer(serializers.ModelSerializer):
tags = TagSerializer(many=True )
answers = AnswerSerializer(many=True, read_only=True)
class Meta:
model = Question
fields = '__all__'
def create(self, validated_data):
tags_data = validated_data.pop('tags')
question = Question.objects.create(**validated_data)
for tag_data in tags_data:
Tag.objects.create(question=question, **tag_data)
return question
这是我的看法:
class QuestionList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
# permission_classes = [AllowAny]
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class QuestionDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
# permission_classes = [IsOwnerOrReadOnly]
lookup_field = 'title'
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class TagList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Tag.objects.all()
serializer_class = TagSerializer
# permission_classes = [AllowAny]
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
我在POST请求中发送此消息:
{
"tags": [{
"name": "new tag",
"discription": "description"
},
{
"name": "another tag",
"discription": "description"
}],
"title": "new one",
"content": "new content",
"comment_cnt": 2,
"like_cnt": 2,
"author": 2
}
并收到此:
"id": 14,
"tags": [],
"answers": [],
"title": "new one",
"content": "new content",
"pub_date": "2019-07-26",
"comment_cnt": 2,
"like_cnt": 2,
"author": 2
和标签分别:
{
"id": 9,
"name": "new tag",
"discription": "description",
"use_cnt": 0
},
{
"id": 10,
"name": "another tag",
"discription": "description",
"use_cnt": 0
}
提前致谢!
最佳答案
您的标记模型没有question
,因此无法正常工作。
尝试改为执行此操作:
def create(self, validated_data):
tags_data = validated_data.pop('tags')
question = Question.objects.create(**validated_data)
for tag_data in tags_data:
tag = Tag.objects.create(**tag_data)
question.tags.add(tag)
question.save()
return question