使用Django更改API POST请求的JSON数据结构
我有一个具有此结构的Django REST API端点,需要将其发布到外部API:使用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”下
{
"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。