使用 django-rest-framework 在数据库中保存 200 个对象的正确方法是什么?

What is the correct way of saving 200 objects in the database using django-rest-framework?

下周我有一个项目要解决这个问题。我有一个包含 3 个字段的模型,其中 2 个是其他模型的外键,另一个字段是一个简单的字符串字段。在前端,我将只向用户显示一个复选框和一个观察字段,一个可以为空或为空的字符串字段。会有一个复选框列表,大约200个。每个都是数据库中的一个对象。我不想对它们中的每一个都提出一个 post 请求,这会使用户体验非常糟糕,200 个字段已经非常糟糕,但在这种情况下是必要的。

所以我想要关于实现此目的的最佳方法的建议和代码示例。这是模型。

class Person(models.Model):
    observation = models.TextField(blank=True, null=True)
    country = models.ForeignKey(Country, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.PROTECT)

我有一个序列化器和一个 ModelViewSet 为它工作,只有一个请求,1 个对象的 POST 请求正在工作。

class PersonSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

我希望前端向后端发送一个大 list/array/object,不确定,后端在单个 POST 请求中获取所有数据并开始将其保存在数据库中的过程。我在想,如果最好的方法是迭代这些数据并在视图内的每个数据上调用序列化程序,或者我是否会实现一种新型的序列化程序来实现它。
关于它的这两个问题question1 and 我都看过了,确实很有帮助,但还是心存疑虑。还有另一个问题,如果发生错误,比如说服务器在进程中间出现故障,连接中断,发生某些事情,那么我的数据将被保存或在中间被中断,我问因为我不能将这些数据分开,所以我需要保证整个 200 个字段都被保存或者 0 个字段被保存。

您可以将数据列表传递给序列化器,并通过将许多参数传递给序列化器来一次验证所有数据

example_data = [
 {'country': 1, 'user': 1, 'observation': ''},
 {'country': 1, 'user': 2, 'observation': ''},
 {'country': 2, 'user': 1, 'observation': ''},
 {'country': 2, 'user': 2, 'observation': ''},
]

serializer = PersonSerializer(data=example_data, many=True)

if serializer.is_valid():
    serializer.save()

当且仅当所有数据实例都有效并且将为数据中的每个数据创建对象时,它的序列化程序才有效。

如果您担心数据库级别的失败,您始终可以在序列化程序的创建方法中使用原子事务。

from django.db import transaction


class PersonSerializer(serializer.ModelSerializer):
    ...

    def create(self, validated_data):
        with transaction.atomic():
            return super().create(validated_data)