Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django更改API POST请求的JSON数据结构_Json_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

使用Django更改API POST请求的JSON数据结构

使用Django更改API POST请求的JSON数据结构,json,django,django-rest-framework,django-serializer,Json,Django,Django Rest Framework,Django Serializer,我有一个具有此结构的Django REST API端点,需要将其发布到外部API: { "body": [ "...", "...", "...", ], "title": [ "...", "...", "...", ], "id": [ "...", "...", "...", ] } “body”下

我有一个具有此结构的Django REST API端点,需要将其发布到外部API:

{
    "body": [
        "...",
        "...",
        "...",
    ],
    "title": [
        "...",
        "...",
        "...",
    ],
    "id": [
        "...",
        "...",
        "...",
    ]
}
“body”下的第一项与“title”和“id”下的第一项一起,依此类推

我遇到的问题是,所讨论的API需要具有以下结构的JSON数据:

{
  "texts": [
    {
      "body": "...",
      "title": "...",
      "id": "..."
    },
    {
      "body": "...",
      "title": "...",
      "id": "..."
    },
    {
      "body": "...",
      "title": "...",
      "id": "..."
    },
  ],
  "language": "EN",
}
我不知道我的端点是如何反映这种结构的,
主体
标题
,和
ID
组合在一起,这些组合嵌套在
文本
下,并在末尾附加
语言
参数

我在
视图.py中使用的序列化程序如下所示:

class MyReasonsSerializer(serializers.Serializer):
    body = serializers.SerializerMethodField()
    title = serializers.SerializerMethodField()
    id = serializers.SerializerMethodField()

    def get_body(self, obj):
        return obj.reasons.order_by('transaction_date').values_list('body', flat=True)

    def get_title(self, obj):
        return obj.reasons.order_by('transaction_date').values_list('title', flat=True)

    def get_id(self, obj):
        return obj.reasons.order_by('transaction_date').values_list('transaction_date', flat=True)

class ReasonsData(RetrieveAPIView):
    queryset = Market.objects.all().prefetch_related('reasons')
    authentication_classes = []
    permission_classes = []
    serializer_class = MyReasonsSerializer
提前感谢您的建议

编辑

以下是模型:

class Market(models.Model):
    title = models.CharField(max_length=50, default="")
    current_price = models.DecimalField(max_digits=5, decimal_places=2, default=0.50)
    description = models.TextField(default="")
    ...
    language = models.CharField(max_length=2, default="EN")

    def __str__(self):
        return self.title[:50]

class Reason(models.Model):
    user_id = models.ForeignKey('users.CustomUser',
        on_delete=models.CASCADE,
        related_name='user_reasons',
        default=None)
    market = models.ForeignKey(
        Market,
        on_delete=models.CASCADE,
        related_name='reasons',
        default=None)
    ...
    valence = models.CharField(max_length=11, default="")
    title = models.TextField(default="")
    body = models.TextField(default="")

    def __str__(self):
        return str(self.title)

我会这样构造它。。。(在没有看到模型并进行试验的情况下,很难准确地知道)

class-ReasonSerializer(serializers.ModelSerializer):
类元:
模型=原因
字段=(“id”、“正文”、“标题”)
类MarketSerializer(serializers.Serializer):
text=ReasonSerializer(many=True,source=“reasons”)
language=serializers.CharField()
类元:
模型=市场
类原因数据(RetrieveAppView):
queryset=Market.objects.all()
身份验证\u类=[]
权限\u类=[]
serializer\u class=MarketSerializer
def get_queryset(自我):
qs=super().get_queryset()
#如果作为查询参数传递,则按价筛选queryset
#价=某物
valence=self.request.query_params.get(“valence”,无)
如果化合价不是无:
qs=qs.filter(原因价=价)
返回qs

您确定Json响应真的是REST吗?把你自己放在最前面。如果您需要使用这个API,您不认为重复3次(正文、标题、id)来填充一些“列表页”会非常困难(而且代价高昂)?谢谢,@t–merPinheiro。你有什么更好的建议吗?谢谢!只需将
语言
属性添加到
市场
模型中,将
EN
作为默认值,然后它就可以像一个符咒一样工作。快速跟进:
原因
模型有一个
配价
属性。是否有一种简单的方法可以过滤查询集,只返回具有特定
价值的
Reason
实例?我想我可以通过使用
Market.objects.filter(reasons\uu valence=value)
来实现这一点,但这似乎不起作用。另外,我已经在原始帖子中添加了模型。你可以使用一个包,比如,但有时它可能会被过度杀戮,我添加了一个编辑来展示如何通过覆盖get_queryset和按查询参数过滤来过滤queryset。