如何设计 Django API 来处理 "Dynamic" 表单?
How to design a Django API to handle a "Dynamic" form?
我构建了一个包含表单数组的 Angular 表单。因此用户可以控制从表单中添加字段或删除字段。我想了解的是如何设计一个 Django API 来处理这种动态形式的 post?
我不希望用户在网站上创建帐户来下订单。这可能吗?
您应该更关心如何为数据建模,而不是考虑界面。这里有一些用于建模数据的选项:
这里有一个简单的例子,关于如何使用Django的JSONField
:
您的模特:
class Order(models.Model):
customer = models.ForeignKey(User, on_delete=models.CASCADE)
#any additional static fields
properties = JSONField()
您的看法:
def create_order_view(request):
if request.method == "POST":
#do your validation
Order.objects.create(user=request.user, properties=request.POST["properties"])
return Response(status=200)
此示例完全不完整,因为您必须添加验证错误处理,最好使用 Django rest-framework 来构建您的 API.
最后,正如我所说,有很多选项可以为您的数据建模,除了我上面提到的之外还有很多其他选项。要决定使用什么模型,你必须知道你的数据将如何被消耗,这样你就可以优化查询时间,此外还有许多其他因素,但这超出了这个 asnwer 的范围。
对我来说,我使用 Django-RESTframework 来构建 api。
实现的方法很简单,只需创建模型并遍历动态部分的项目,并将外键字段分配给 obj.id 创建的。首先,我创建了主模型实例,然后创建了子实例的实例。我将使用 Order 和 Item 来演示这个想法,Item 实例将具有用于 Order 模型的 Foreinkey 字段。
在 Item 模型中,将 "related_name" 参数添加到 Foreinkey 字段
order = models.ForeignKey(Order, related_name='items',on_delete=models.CASCADE)
serializers.py
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = [
....your fields...
]
class OrderSerializer(serializers.ModelSerializer):
items = ItemSerializer(many=True)
class Meta:
model = Order
fields = [
'order', ....
]
def create(self, validated_data):
items_data = validated_data.pop("items")
order = Order.objects.create(**validated_data)
order.total_fees = order.delivery_fees
for item in items_data:
i = Item.objects.create(order=order, **item)
return order
我构建了一个包含表单数组的 Angular 表单。因此用户可以控制从表单中添加字段或删除字段。我想了解的是如何设计一个 Django API 来处理这种动态形式的 post?
我不希望用户在网站上创建帐户来下订单。这可能吗?
您应该更关心如何为数据建模,而不是考虑界面。这里有一些用于建模数据的选项:
这里有一个简单的例子,关于如何使用Django的JSONField
:
您的模特:
class Order(models.Model):
customer = models.ForeignKey(User, on_delete=models.CASCADE)
#any additional static fields
properties = JSONField()
您的看法:
def create_order_view(request):
if request.method == "POST":
#do your validation
Order.objects.create(user=request.user, properties=request.POST["properties"])
return Response(status=200)
此示例完全不完整,因为您必须添加验证错误处理,最好使用 Django rest-framework 来构建您的 API.
最后,正如我所说,有很多选项可以为您的数据建模,除了我上面提到的之外还有很多其他选项。要决定使用什么模型,你必须知道你的数据将如何被消耗,这样你就可以优化查询时间,此外还有许多其他因素,但这超出了这个 asnwer 的范围。
对我来说,我使用 Django-RESTframework 来构建 api。
实现的方法很简单,只需创建模型并遍历动态部分的项目,并将外键字段分配给 obj.id 创建的。首先,我创建了主模型实例,然后创建了子实例的实例。我将使用 Order 和 Item 来演示这个想法,Item 实例将具有用于 Order 模型的 Foreinkey 字段。
在 Item 模型中,将 "related_name" 参数添加到 Foreinkey 字段
order = models.ForeignKey(Order, related_name='items',on_delete=models.CASCADE)
serializers.py
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = [
....your fields...
]
class OrderSerializer(serializers.ModelSerializer):
items = ItemSerializer(many=True)
class Meta:
model = Order
fields = [
'order', ....
]
def create(self, validated_data):
items_data = validated_data.pop("items")
order = Order.objects.create(**validated_data)
order.total_fees = order.delivery_fees
for item in items_data:
i = Item.objects.create(order=order, **item)
return order