Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中为json响应定义嵌套列表_Python_Django_Django Models_Django Rest Framework_Django Serializer - Fatal编程技术网

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

Python 如何在django中为json响应定义嵌套列表,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我是Django的新手,所以我想创建一个代表航运公司运营的基本应用程序。我有一份包含货物的工作单。因此,my models.py包含以下内容: class WorkOrder (models.Model): status = models.CharField(max_length=300,default = "New") source = models.CharField(max_length=300) destination = models.CharField(max

我是Django的新手,所以我想创建一个代表航运公司运营的基本应用程序。我有一份包含货物的工作单。因此,my 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")
我在serializers.py中定义了两个序列化程序WorkOrderSerializer和ShipmentSerializer。我想返回包含在工单对象中的装运列表

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")
我遵循这里指定的模型。

在my 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和模型中的变量名可能不匹配,因此请忽略这一点,因为我已经剥离了一些变量,以避免使示例复杂化。)


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

    我尝试了你的建议,当我尝试点击URL时,我得到了以下错误:没有这样的表:workorder\u发货。我的数据库当前没有任何发货,因此我希望它显示一个空的发货列表,其中包含工单的其余数据。另外一点是,我在workorder的数据库中输入了部分内容,其中我没有输入任何装运数据。我必须这么做吗?只是确保我没有在你认为不会出错的地方出错:)你迁移了数据库吗?该死!那是丢失的一环!非常感谢您的帮助!:-)
    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']