Django 与邮递员一起发布请求多个字段DRF

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

目标:使用“POST”从Postman创建数据库中的新条目

我试图从邮递员那里发送数据,我正在使用嵌套序列化。我已经更改了创建方法,我已经共享了下面的代码段。还有,我试过了,但没用。有人能指出我犯的错误吗

当我试图发布表单数据时,错误是
{“杂志”:[“此字段是必需的。”]}
。 当我试图将其作为原始数据发布时,错误是禁止直接分配到多对多集合的前端。改用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”
实际上,我所做的恰恰相反,我正在尝试创建文章并将其映射到多个杂志,即:一篇文章可以在多个杂志上发表,因此有很多领域。我只是大大改进了我的答案,并将其缩短。它现在应该可以工作了。很抱歉没有传递正确的参数,它可以正常工作,但是现在我可以看到数据没有显示嵌套序列化。我没有看到任何杂志的细节。