Django:处理 post JSON 请求
Django : handle post JSON requests
我需要用 django 处理一些 JSON 数据。
我将收到此数据:
{
"user": 8,
"orderDay": "2020-06-24",
"deliveryDay": "2020-06-30",
"deliveryAddress": "Place des Fêtes",
"comment": "",
"orderDetail":
[
{
"product": 2,
"byProduct": 2,
"quantity": 43
},
{
"product": 3,
"byProduct": 3,
"quantity": 5
}
]
}
我想将此数据保存在 3 个不同的 table 中:order 和 orderDetail。
models.py:
class order(models.Model):
user = models.ForeignKey(memberArea, on_delete=models.CASCADE)
comment = models.TextField(null=True, blank=True)
orderDay = models.DateTimeField(auto_now_add=True)
deliveryDay = models.DateField()
deliveryPlace = models.CharField(max_length=255)
state = models.CharField(max_length=255)
price = models.TextField(null=True, blank=True)
response = models.TextField(null=True, blank=True)
...
class orderDetail(models.Model):
order = models.ForeignKey(order, on_delete=models.CASCADE)
product = models.ForeignKey(product, on_delete=models.CASCADE)
byProduct = models.ManyToManyField(byProduct)
quantity = models.CharField(max_length=255)
...
class byProduct(models.Model):
product = models.ForeignKey(product, on_delete = models.CASCADE)
name = models.CharField(max_length=255)
...
class product(models.Model):
name = models.CharField(max_length=255)
prix_uni = models.TextField(null=True, blank=True)
prix_kg = models.TextField(null=True, blank=True)
dispo = models.BooleanField(null=True, blank=True)
category = models.ForeignKey(category, on_delete=models.CASCADE)
redu = models.TextField(null=True, blank=True)
我找不到任何关于如何使用 Django 处理 JSON 数据的好文档。
提前致谢
更新
我试过这样的事情:
serializer.py:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = product
fields = '__all__'
class ByProductSerializer(serializers.ModelSerializer):
class Meta:
model = byProduct
fields = '__all__'
class orderDetailSerializer(serializers.ModelSerializer):
order = serializers.PrimaryKeyRelatedField(many=False, queryset=order.objects.all())
class Meta:
model = orderDetail
fields = '__all__'
class OrderSerializer(serializers.ModelSerializer):
orderDetail = orderDetailSerializer(many=True)
class Meta:
model = order
fields = ['user', 'comment', 'deliveryDay', 'deliveryAddress', 'orderDetail']
def create(self, validated_data):
order_detail_data = validated_data.pop('orderDetail')
new_order = order.objects.create(**validated_data)
new_order.save()
for product in order_detail_data:
order_detail = orderDetail.objects.create(**product)
order_detail.order.add(new_order.id)
return new_order
views.py:
@api_view(['POST'])
def order(request, format=None):
if request.method == 'POST':
serializer = OrderSerializer(data=request.data)
data = {}
if serializer.is_valid():
serializer.save()
data['response'] = "Your order went well"
return Response(data)
return Response(serializer.errors)
您需要做的更改很少。
- 更改数据格式:
{
"user": 8,
"orderDay": "2020-06-24",
"deliveryDay": "2020-06-30",
"deliveryAddress": "Place des Fêtes",
"comment": "",
"orderDetail":
[
{
"product": 2,
"byProduct": [2],
"quantity": 43
},
{
"product": 3,
"byProduct": [3],
"quantity": 5
}
]
}
byProduct
是一个 ManyToMany
字段,因此它必须有一个产品列表。
- 在你的
orderDetailSerializer
:
class orderDetailSerializer(serializers.ModelSerializer):
class Meta:
model = orderDetail
fields = ['product', 'byProduct', 'quantity']
请注意,在 fields
中我没有包含 order
,因为在我们的数据中没有这样的字段,因此出现错误 order field is required
。这很简单,因为序列化器会解析我们发送的数据,如果有什么东西丢失了,它会通知我们。
orderSerializer
的变化:
class OrderSerializer(serializers.ModelSerializer):
orderDetail = orderDetailSerializer(many=True)
class Meta:
model = order
fields = ['user', 'comment', 'deliveryAddress', 'deliveryDay', 'orderDetail']
def create(self, validated_data):
order_detail_data = validated_data.pop('orderDetail')
new_order = order.objects.create(**validated_data)
# new_order.save()
for product in order_detail_data:
by_products = product.pop('byProduct')
order_detail = orderDetail.objects.create(order=new_order, **product)
order_detail.byProduct.set(by_products)
order_detail.save()
return new_order
有几点需要注意,fields
包括 orderDetail
虽然它不是 order
模型的一部分,但是为了解析传递的数据,我们需要添加这样的字段, 如果还有更多。在create
方法byProduct
里面是一个ManyToMany
字段,所以我们必须使用set()
方法来分配它们,direct assignment
是不允许的。
我需要用 django 处理一些 JSON 数据。 我将收到此数据:
{
"user": 8,
"orderDay": "2020-06-24",
"deliveryDay": "2020-06-30",
"deliveryAddress": "Place des Fêtes",
"comment": "",
"orderDetail":
[
{
"product": 2,
"byProduct": 2,
"quantity": 43
},
{
"product": 3,
"byProduct": 3,
"quantity": 5
}
]
}
我想将此数据保存在 3 个不同的 table 中:order 和 orderDetail。 models.py:
class order(models.Model):
user = models.ForeignKey(memberArea, on_delete=models.CASCADE)
comment = models.TextField(null=True, blank=True)
orderDay = models.DateTimeField(auto_now_add=True)
deliveryDay = models.DateField()
deliveryPlace = models.CharField(max_length=255)
state = models.CharField(max_length=255)
price = models.TextField(null=True, blank=True)
response = models.TextField(null=True, blank=True)
...
class orderDetail(models.Model):
order = models.ForeignKey(order, on_delete=models.CASCADE)
product = models.ForeignKey(product, on_delete=models.CASCADE)
byProduct = models.ManyToManyField(byProduct)
quantity = models.CharField(max_length=255)
...
class byProduct(models.Model):
product = models.ForeignKey(product, on_delete = models.CASCADE)
name = models.CharField(max_length=255)
...
class product(models.Model):
name = models.CharField(max_length=255)
prix_uni = models.TextField(null=True, blank=True)
prix_kg = models.TextField(null=True, blank=True)
dispo = models.BooleanField(null=True, blank=True)
category = models.ForeignKey(category, on_delete=models.CASCADE)
redu = models.TextField(null=True, blank=True)
我找不到任何关于如何使用 Django 处理 JSON 数据的好文档。 提前致谢
更新
我试过这样的事情: serializer.py:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = product
fields = '__all__'
class ByProductSerializer(serializers.ModelSerializer):
class Meta:
model = byProduct
fields = '__all__'
class orderDetailSerializer(serializers.ModelSerializer):
order = serializers.PrimaryKeyRelatedField(many=False, queryset=order.objects.all())
class Meta:
model = orderDetail
fields = '__all__'
class OrderSerializer(serializers.ModelSerializer):
orderDetail = orderDetailSerializer(many=True)
class Meta:
model = order
fields = ['user', 'comment', 'deliveryDay', 'deliveryAddress', 'orderDetail']
def create(self, validated_data):
order_detail_data = validated_data.pop('orderDetail')
new_order = order.objects.create(**validated_data)
new_order.save()
for product in order_detail_data:
order_detail = orderDetail.objects.create(**product)
order_detail.order.add(new_order.id)
return new_order
views.py:
@api_view(['POST'])
def order(request, format=None):
if request.method == 'POST':
serializer = OrderSerializer(data=request.data)
data = {}
if serializer.is_valid():
serializer.save()
data['response'] = "Your order went well"
return Response(data)
return Response(serializer.errors)
您需要做的更改很少。
- 更改数据格式:
{
"user": 8,
"orderDay": "2020-06-24",
"deliveryDay": "2020-06-30",
"deliveryAddress": "Place des Fêtes",
"comment": "",
"orderDetail":
[
{
"product": 2,
"byProduct": [2],
"quantity": 43
},
{
"product": 3,
"byProduct": [3],
"quantity": 5
}
]
}
byProduct
是一个 ManyToMany
字段,因此它必须有一个产品列表。
- 在你的
orderDetailSerializer
:
class orderDetailSerializer(serializers.ModelSerializer):
class Meta:
model = orderDetail
fields = ['product', 'byProduct', 'quantity']
请注意,在 fields
中我没有包含 order
,因为在我们的数据中没有这样的字段,因此出现错误 order field is required
。这很简单,因为序列化器会解析我们发送的数据,如果有什么东西丢失了,它会通知我们。
orderSerializer
的变化:
class OrderSerializer(serializers.ModelSerializer):
orderDetail = orderDetailSerializer(many=True)
class Meta:
model = order
fields = ['user', 'comment', 'deliveryAddress', 'deliveryDay', 'orderDetail']
def create(self, validated_data):
order_detail_data = validated_data.pop('orderDetail')
new_order = order.objects.create(**validated_data)
# new_order.save()
for product in order_detail_data:
by_products = product.pop('byProduct')
order_detail = orderDetail.objects.create(order=new_order, **product)
order_detail.byProduct.set(by_products)
order_detail.save()
return new_order
有几点需要注意,fields
包括 orderDetail
虽然它不是 order
模型的一部分,但是为了解析传递的数据,我们需要添加这样的字段, 如果还有更多。在create
方法byProduct
里面是一个ManyToMany
字段,所以我们必须使用set()
方法来分配它们,direct assignment
是不允许的。