Django 与邮递员一起发布请求多个字段DRF
目标:使用“POST”从Postman创建数据库中的新条目 我试图从邮递员那里发送数据,我正在使用嵌套序列化。我已经更改了创建方法,我已经共享了下面的代码段。还有,我试过了,但没用。有人能指出我犯的错误吗 当我试图发布表单数据时,错误是Django 与邮递员一起发布请求多个字段DRF,django,django-models,django-rest-framework,django-views,postman,Django,Django Models,Django Rest Framework,Django Views,Postman,目标:使用“POST”从Postman创建数据库中的新条目 我试图从邮递员那里发送数据,我正在使用嵌套序列化。我已经更改了创建方法,我已经共享了下面的代码段。还有,我试过了,但没用。有人能指出我犯的错误吗 当我试图发布表单数据时,错误是{“杂志”:[“此字段是必需的。”]}。 当我试图将其作为原始数据发布时,错误是禁止直接分配到多对多集合的前端。改用magazine.set()。 这是我的模型: class Article(models.Model): title = models.Ch
{“杂志”:[“此字段是必需的。”]}
。
当我试图将其作为原始数据发布时,错误是禁止直接分配到多对多集合的前端。改用magazine.set()。
这是我的模型:
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey('authors.Author', on_delete=models.CASCADE)
magazine = models.ManyToManyField('articles.Magazine')
def __str__(self):
return self.title
class Magazine(models.Model):
name = models.CharField(max_length=30)
title = models.CharField(max_length=100)
def __str__(self):
return self.name
这是我的序列化程序:
class MagazineSerializer(serializers.ModelSerializer):
class Meta:
model = Magazine
fields = '__all__'
class ArticleSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True, many=False)
magazine = MagazineSerializer(many=True)
class Meta:
model = Article
fields = [
'title',
'content',
'author',
'magazine',
]
def create(self, validated_data):
allmags = []
magazine = validated_data.pop('magazine')
for i in magazine:
if Magazine.objects.get(id=magazine["id"]).exists():
mags = Magazine.objects.get(id=magazine["id"])
allmags.append(mags)
else:
return Response({"Error": "No such magazine exists"}, status=status.HTTP_400_BAD_REQUEST)
validated_data['author'] = self.context['request'].user
validated_data['magazine'] = allmags
return Article.objects.create(**validated_data)
以下是我的看法:
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
class MagazineViewSet(viewsets.ModelViewSet):
queryset = Magazine.objects.all()
serializer_class = MagazineSerializer
serializer_action_class = {
'get_articles': MagazineSerializer,
}
@action(detail=True, url_path='articles', url_name='articles')
def get_articles(self, request, pk=None):
articles = Article.objects.filter(magazine=self.kwargs.get('pk'))
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data, status=200)
以下是我尝试将数据作为原始数据发送的方式:
{
"title": "New Post form Postman",
"content": "Postman content new",
"magazine": [
{
"id": 1,
"name": "The Times",
"title": "All News"
}
]
}
首先,您能否澄清您是否希望从嵌套序列化程序创建新的
杂志
对象,还是希望用户只能为现有杂志创建文章
(这似乎是第二次,因为您正在调用.exists()
)
第1例:
如果您要处理第一个案例,您希望在相同的POST
请求中创建新杂志,我建议您使用该软件包
第2例:
对于这一点,您也应该使用包。或者,您可以使用此黑客:
来自rest\u framework.exceptions导入验证错误
从rest_框架导入序列化程序
来自。模特进口文章,杂志
类ArticleSerializer(serializers.ModelSerializer):
author=AuthorSerializer(只读=True,多个=False)
杂志=MagazineSerializer(多个=True,只读=True)
#接受PKs列表
杂志\u id=serializers.PrimaryKeyRelatedField(
many=True,write_only=True,queryset=magage.objects.all()
)
类元:
模型=文章
字段=[
“头衔”,
“内容”,
“作者”,
"杂志",,
"杂志",,
]
def创建(自我验证的_数据):
杂志=已验证的数据.pop(“杂志ID”,无)
已验证的_数据[“作者”]=self.context[“请求”].user
article=article.objects.create(**已验证的_数据)
如果杂志:
文章.杂志.套装(杂志)
退货
现在,您的POST
请求JSON
正文应该如下所示:
{
“标题”:“新邮递员”,
“内容”:“邮递员新内容”,
“杂志编号”:[1]
}
其中,参数获取主键列表
奖金
另外,出于好奇,您确定要使用ManytoManyField
?我假设一篇文章
只能属于一本杂志
,您应该使用外键
,例如:
magazine=models.ForeignKey(“articles.magazine”,related_name=“articles”)
然后在你的“行动”中,你可以做出以下改变:
@action(detail=True,url\u path='articles',url\u name='articles')
def get_文章(自我、请求、主键=无):
articles=self.get_object().articles
serializer=ArticleSerializer(articles,many=True)
返回响应(serializer.data,状态=200)
是的,正如您所说,我正在尝试实现第二种情况,我确实尝试过这样做,但我不断得到错误“无效数据。需要字典,但得到int。”.
我也尝试了传递整个对象,但它不起作用。我也尝试了你的解决方案,我得到了AttributeError:“Article”对象没有属性“magazine\u set”
实际上,我所做的恰恰相反,我正在尝试创建文章并将其映射到多个杂志,即:一篇文章可以在多个杂志上发表,因此有很多领域。我只是大大改进了我的答案,并将其缩短。它现在应该可以工作了。很抱歉没有传递正确的参数,它可以正常工作,但是现在我可以看到数据没有显示嵌套序列化。我没有看到任何杂志的细节。