【发布时间】:2020-09-22 08:02:36
【问题描述】:
我的目标是嵌套 JSON 响应。我的目标输出是这样的;
[
{
list_id: <list_id_1>,
list_name: <list_name_1>,
{
item_id: <item_id_1>,
item_name: <item_name_1>,
},
{
item_id: <item_id_2>,
item_name: <item_name_2>,
}
}
]
我想让我的输出成为一个嵌套的 JSON。到目前为止,这是我的进步;
models.py
class List(models.Model):
list_name = models.CharField(max_length=30, blank=True, null=True, default='My List')
def __str__(self):
return ("List ID: " + str(self.id) + ", " + self.list_name)
class Item(models.Model):
list = models.ForeignKey('List', related_name='items', on_delete=models.CASCADE)
item_name = models.CharField(max_length=30, blank=False, null=False)
item_desc = models.CharField(max_length=50, blank=True, null=True)
item_category = models.CharField(max_length=20, blank=True, null=True)
item_price = models.DecimalField(max_digits=5, decimal_places=2, blank=False, null=False, default=0.00)
item_qty = models.IntegerField(blank=False, null=False, default=1)
is_complete = models.BooleanField(default=False)
def __str__(self):
return ("Item ID: " + str(self.id) + ", " + self.item_name)
@property
def item_tot_price(self):
return (self.item_price * self.item_qty)
序列化器.py
class ItemSerializer(serializers.ModelSerializer):
list_name = serializers.CharField(read_only=True, source = "list.list_name")
class Meta:
model = models.Item
fields = ['id', 'list', 'list_name', 'item_name', 'item_desc', 'item_category', 'item_price', 'item_qty', 'is_complete', 'item_tot_price']
views.py
class ItemListAPIView(generics.ListAPIView):
serializer_class = serializers.ItemSerializer
def get_queryset(self):
"""
This APIView should return a list of all the items
that are related to a List as determined by the
list portion of the URL.
"""
list = self.kwargs['list']
return models.Item.objects.filter(list__id=list)
urls.py
urlpatterns = [
path('Items/<int:list>/', views.ItemListAPIView.as_view()),
]
使用我当前进度的输出:
[
{
"item_id": 10,
"list_id": 4,
"list_name": "TestName",
"item_name": "TestName",
"item_desc": "TestName",
"item_category": "TestName",
"item_price": "2.00",
"item_qty": 9,
"is_complete": true,
"item_tot_price": 18.0
},
{
"item_id": 12,
"list_id": 4,
"list_name": "TestName",
"item_name": "TestName",
"item_desc": "TestName",
"item_category": "TestName",
"item_price": "0.00",
"item_qty": 1,
"is_complete": false,
"item_tot_price": 0.0
},
]
从我当前的输出 JSON 中可以看出,它会将项目排序到相应的列表中。但是我想将 list_id 和 list_name 显示为父项,然后显示项目的数据。
简单来说,我想做一个能够获取 list_id 并显示与列表相关的所有项目的端点。
免责声明:我使用 many=True agruments、related_fields、HyperlinkedModelSerializer 弄乱了序列化程序。它们都没有按我想要的方式工作。
【问题讨论】:
-
你可以创建一个新的序列化器,例如“ListSerializer”的构造方式与您使用 ItemSerializer 的方式相同。 “ListSerializer”包含具有 many=True 的 ItemSerializer。也许你可以试试这个并发布你的解决方案。如果没有帮助,请再次询问。
-
我的错误。在此之前,我制作了 ItemSerializer 并将 many=True 用于列表。据我了解,有很多项目记录,所以我立即认为它会显示该列表中的所有项目,假设我制作了一个自定义 get_queryset。看来我弄错了。谢谢你指出。干杯
标签: python python-3.x django django-rest-framework