Python 更新Django Rest框架中的多个关系

Python 更新Django Rest框架中的多个关系,python,django,django-rest-framework,Python,Django,Django Rest Framework,在django应用程序中,订单和包之间有很多关系。一个订单可以有多个包。我想知道更新和创建方法 Models.py class Package(models.Model): prod_name = models.CharField(max_length=255, default=0) quantity = models.IntegerField(default=0) unit_price = models.IntegerField(default=0) class O

在django应用程序中,订单和包之间有很多关系。一个订单可以有多个包。我想知道更新和创建方法

Models.py

class Package(models.Model):

    prod_name = models.CharField(max_length=255, default=0)
    quantity = models.IntegerField(default=0)
    unit_price = models.IntegerField(default=0)

class Orders(models.Model):

    order_id = models.CharField(max_length=255, default=0)
    package = models.ManyToManyField(Package)
    is_cod = models.BooleanField(default=False)
序列化程序.py

class PackageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Package
        fields = "__all__"

class OrderSerializer(serializers.ModelSerializer):
    package = PackageSerializer(many=True)

    class Meta:
        model = Orders
        fields = "__all__"
Views.py

class OrdersCreateAPIView(generics.CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = OrderSerializer

    def post(self, request):

        serializer = OrderSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class OrdersCreateAPIView(CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = OrderSerializer

    def perform_create(self,serializer):
        serializer.save(owner=self.request.user)
这是否足以处理相关数据?我试图了解Django和DRF中的许多关系,因此请解释我是否需要更改中的模型或视图

更新:

我已经更新了序列化程序和视图,以便创建许多相关对象,如下所示:

class OrderSerializer(serializers.ModelSerializer):
    package = PackageSerializer(many=True)

    class Meta:
        model = Orders
        fields = "__all__"

    def create(self, validated_data):
        package_data = validated_data.pop('package')
        pkgs = []
        order = Orders.objects.create(**validated_data)
        for i in package_data:
            try:
                p = Package.objects.create(**i)
                pkgs.append(p)
            except:
                pass
        order.package.set(pkgs)
        return order
Views.py

class OrdersCreateAPIView(generics.CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = OrderSerializer

    def post(self, request):

        serializer = OrderSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class OrdersCreateAPIView(CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = OrderSerializer

    def perform_create(self,serializer):
        serializer.save(owner=self.request.user)
但是,我仍然不清楚是否覆盖RetrieveUpdatedStroyapiView的更新方法。此外,上述方法是否是存储M2M相关对象的正确方法

请帮助完成序列化程序的更新部分,我知道我必须在序列化程序的工作代码库中传递查询 因此,您将获得该表中所述的基本CRUD端点,请参见DefaultRouter参考

让您的订单列表终点为/foo-bar/order/

HTTP POST到/foo-bar/order/以创建新实例 HTTP PUT或HTTP修补程序到/foo bar/order//以更新内容 笔记 在这种情况下,如果希望将现有包关系映射到订单,则应传递包的id值

工具书类 更新-1 你可以这样连接视图

urlpatterns = [
    path('foo/order/', OrderViewSet.as_view({'post': 'create'})),  # create new Order instance
    path('foo/order/<int:pk>/', OrderViewSet.as_view({'patch': 'partial_update'})),  # update Order instance

]
注意:这只支持HTTP POST和HTTP补丁

工作代码库 因此,您将获得该表中所述的基本CRUD端点,请参见DefaultRouter参考

让您的订单列表终点为/foo-bar/order/

HTTP POST到/foo-bar/order/以创建新实例 HTTP PUT或HTTP修补程序到/foo bar/order//以更新内容 笔记 在这种情况下,如果希望将现有包关系映射到订单,则应传递包的id值

工具书类 更新-1 你可以这样连接视图

urlpatterns = [
    path('foo/order/', OrderViewSet.as_view({'post': 'create'})),  # create new Order instance
    path('foo/order/<int:pk>/', OrderViewSet.as_view({'patch': 'partial_update'})),  # update Order instance

]

注意:这只支持HTTP POST和HTTP补丁

提示:您不必重写POST…,DRF将为您处理它:如果您发送PK值,DRF将与FK和M2M关系无缝工作,这是默认行为。在您的情况下,需要重写的创建和更新方法serializer@ArakkalAbu我不必创建post函数?Post默认由序列化程序处理?如果是这样,它不会创建对象吗?那么为什么我必须重写create函数呢?这里,post方法在DB中创建一个新对象,理想情况下,它是由泛型内部处理的。createapiew,而不是由序列化程序处理。提示:您不必重写post。。。。,DRF将为您处理:如果您发送PK值,DRF将与FK和M2M关系无缝工作,这是默认行为。在您的情况下,需要重写的创建和更新方法serializer@ArakkalAbu我不必创建post函数?Post默认由序列化程序处理?如果是这样,它不会创建对象吗?那么为什么我必须重写create函数呢?在这里,post方法在DB中创建一个新对象,理想情况下,它是由泛型.CreateAPIView内部处理的,而不是由序列化程序处理的。我如何在视图中传递pk,以便只更新选定的记录?@RahulSharma我已经更新了答案。请检查它的代码是非常好的书面和非常有用的,但我正在努力学习的基础知识,因此我想做它的网址为foo酒吧/,OrdersUpdate.as_查看。请告诉我,如果你可以简化更新,这将是非常有帮助的关于URL模式,检查更新-1部分。关于更新。。。方法崩溃,我不知道这是一段复杂的代码。请仔细阅读,代码片段中的所有内容都已在Python中,因此在Django中,您将获得所有这些方法/函数/类的简单引用。谢谢:我有一些愚蠢的问题,所以我要问。。如果我删除这些包,更新会处理吗?还有,为什么要编写package_instance,创建但只附加package_instance.pk?我如何在视图中传递pk,以便只更新所选记录?@RahulSharma我已经更新了答案。请检查它的代码是非常好的书面和非常有用的,但我正在努力学习的基础知识,因此我想做它的网址为foo酒吧/,OrdersUpdate.as_查看。请告诉我,如果你可以简化更新,这将是非常有帮助的关于URL模式,检查更新-1部分。关于更新。。。方法崩溃,我不知道这是一段复杂的代码。请仔细阅读,代码片段中的所有内容都已在Python中,因此在Django中,您将获得所有这些方法/函数/类的简单引用。谢谢:我有一些愚蠢的问题,所以我要问。。如果我删除这些包,更新会处理吗?还有,为什么要编写package_instance,创建但只附加package_instance.pk?