如何设计 Django API 来处理 "Dynamic" 表单?

How to design a Django API to handle a "Dynamic" form?

我构建了一个包含表单数组的 Angular 表单。因此用户可以控制从表单中添加字段或删除字段。我想了解的是如何设计一个 Django API 来处理这种动态形式的 post?

我不希望用户在网站上创建帐户来下订单。这可能吗?

您应该更关心如何为数据建模,而不是考虑界面。这里有一些用于建模数据的选项:

  • 选项一是使用常规 Django ORM,在这种情况下,您可以对任何动态属性使用 JSONField

  • 选项二是使用任何无模式数据模型,例如基于文档的数据库(例如 MongoDB)。

这里有一个简单的例子,关于如何使用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