如何在Django中为json响应定义嵌套列表

2024-09-25 10:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django新手,所以我想创建一个基本的应用程序来代表航运公司的运营。我有一份工单,里面有货物。所以我的模型.py包含以下内容:

class WorkOrder (models.Model):
    status = models.CharField(max_length=300,default = "New")
    source = models.CharField(max_length=300)
    destination = models.CharField(max_length=
    material = models.CharField(max_length=300)
    shipmentlist = [] //PROBLEMATIC CODE

class Shipment (models.Model):
    expected_startDate = models.DateTimeField(default=timezone.now)
    expected_endDate = models.DateTimeField(default=timezone.now)
    shipment_status = models.CharField(max_length=300,default = "Not Started")

我有2个序列化器WorkOrderSerializer和ShipmentSerializer,我在序列化程序.py. 我想返回包含在工单对象中的装运列表。在

^{pr2}$

我遵循这里指定的型号。 http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

在我的视图.py当我收到这样的请求时,我正在调用序列化程序

def workorder_operations(request,workorder_pk):
    workorder = Work_Order.objects.filter(pk=workorder_pk)
    serializer = Work_Order_Serializer(workorder)

这将生成一个如下所示的json

{
    "shipmentlist":[]
}

我完全搞不清有两件事:

  1. 为什么它只显示shipment对象而不显示其他对象,即使它无法解析数据或其他对象。在
  2. 为什么货物没有被填充。在

当我改用ModelSerializer并以这种方式定义序列化程序时,一切都非常好:

class ShipmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shipment
        fields =('expected_startDate','expected_endDate','shipment_status')
class WorkOrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = WorkOrder
        fields =('request_id','generated_date','status', 'source','destination','material')

我想知道的是如何表示一个嵌套的对象列表,以便它们可以正确地序列化。 我希望我的WorkOrder对象的json看起来像这样:(注意:json和模型中的变量名可能不匹配,所以请忽略这一点,因为我已经删除了一些变量,以免使示例复杂化。)

{
"id": "WO20170912",
"source": "BBSR",
"destination": "RKL",
"customer_id": 1,
"material": "Granite",
"weight": 19,
"status": "ALLOCATED",
"shipments": [
  {
    "id":"SH01234",
    "work_order_id": "WO20170912",
    "source": "BBSR",
    "destination": "RKL"
  },
  {
    "id":"SH01255",
    "work_order_id": "WO20170912",
    "source": "BBSR",
    "destination": "RKL"
  }
]
}

Tags: 对象pyiddefaultsource序列化modelsstatus
1条回答
网友
1楼 · 发布于 2024-09-25 10:32:48

WorkOrder模型中添加ManyToManyField

class Shipment (models.Model):
    expected_startDate = models.DateTimeField(default=timezone.now)
    expected_endDate = models.DateTimeField(default=timezone.now)
    shipment_status = models.CharField(max_length=300,default = "Not Started")


class WorkOrder (models.Model):
    status = models.CharField(max_length=300,default = "New")
    source = models.CharField(max_length=300)
    destination = models.CharField(max_length=
    material = models.CharField(max_length=300)
    shipments = models.ManyToManyField(Shipment, related_name='shipments')

序列化程序应该是

^{pr2}$

相关问题 更多 >