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

How to define a nested list in django for json response

我是 Django 的新手,所以我想创建代表运输公司运营的基本应用程序。我有一个包含发货的工单。所以我的 models.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")

我在 serialzers.py 中定义了 2 个序列化程序 WorkOrderSerializer 和 ShipmentSerializer。我想要 return 工单对象中包含的发货清单。

class WorkOrderSerializer        
    generated_date = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=300, default="New")
    source = models.CharField(max_length=300)
    destination = models.CharField(max_length=300)
    material = models.CharField(max_length=300)
    shipmentlist = ShipmentSerializer(many=True)

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

我正在遵循此处指定的模型。 http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

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

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

这会生成一个 json,如下所示

{
    "shipmentlist":[]
}

我对两件事完全感到困惑:

  1. 为什么它只显示装运对象而不显示其他对象,即使它无法解析数据或其他内容。
  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"
  }
]
}

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')

序列化程序就像,

class ShipmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shipment
        fields = [f.name for f in model._meta.fields]

class WorkOrderSerializer(serializers.ModelSerializer):
    shipments = ShipmentSerializer(many=True)
    class Meta:
        model = WorkOrder
        fields = [f.name for f in model._meta.fields] + ['shipments']