如何在 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":[]
}
我对两件事完全感到困惑:
- 为什么它只显示装运对象而不显示其他对象,即使它无法解析数据或其他内容。
- 为什么没有填充装运。
当我改用 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']
我是 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":[]
}
我对两件事完全感到困惑:
- 为什么它只显示装运对象而不显示其他对象,即使它无法解析数据或其他内容。
- 为什么没有填充装运。
当我改用 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']