第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更新 Django Rest Framework 中的多對多關(guān)系

更新 Django Rest Framework 中的多對多關(guān)系

交互式愛情 2022-11-01 15:46:49
Orders在我的 django 應用程序中,我在和之間建立了多對多關(guān)系Packages。一個訂單可以有多個包裹。我想了解更新和創(chuàng)建方法模型.pyclass 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)序列化程序.pyclass PackageSerializer(serializers.ModelSerializer):    class Meta:        model = Package        fields = "__all__"class OrderSerializer(serializers.ModelSerializer):    package = PackageSerializer(many=True)    class Meta:        model = Orders        fields = "__all__"視圖.pyclass 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)這足以處理相關(guān)數(shù)據(jù)嗎?我正在嘗試了解ManytoManyDjango 和 DRF 中的關(guān)系,所以請解釋我是否需要更改模型或視圖更新:我已經(jīng)更新了我的序列化程序和視圖,以便創(chuàng)建manytomany像這樣的相關(guān)對象: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但是我仍然不清楚覆蓋update. RetrieveUpdateDestroyAPIView另外,上述方法是存儲M2M相關(guān)對象的正確方法嗎?請幫助更新序列化程序的部分,我知道我必須在序列化程序中傳遞查詢
查看完整描述

1 回答

?
慕姐8265434

TA貢獻1813條經(jīng)驗 獲得超2個贊

工作代碼庫

#serializers.py

class PackageSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField()


    class Meta:

        model = Package

        fields = "__all__"



class OrderSerializer(serializers.ModelSerializer):

    package = PackageSerializer(many=True)


    def get_or_create_packages(self, packages):

        package_ids = []

        for package in packages:

            package_instance, created = Package.objects.get_or_create(pk=package.get('id'), defaults=package)

            package_ids.append(package_instance.pk)

        return package_ids


    def create_or_update_packages(self, packages):

        package_ids = []

        for package in packages:

            package_instance, created = Package.objects.update_or_create(pk=package.get('id'), defaults=package)

            package_ids.append(package_instance.pk)

        return package_ids


    def create(self, validated_data):

        package = validated_data.pop('package', [])

        order = Orders.objects.create(**validated_data)

        order.package.set(self.get_or_create_packages(package))

        return order


    def update(self, instance, validated_data):

        package = validated_data.pop('package', [])

        instance.package.set(self.create_or_update_packages(package))

        fields = ['order_id', 'is_cod']

        for field in fields:

            try:

                setattr(instance, field, validated_data[field])

            except KeyError:  # validated_data may not contain all fields during HTTP PATCH

                pass

        instance.save()

        return instance


    class Meta:

        model = Orders

        fields = "__all__"


#views.py

class OrderViewSet(viewsets.ModelViewSet):

    serializer_class = OrderSerializer

    queryset = Orders.objects.all()

DefaultRouter在as的幫助下注冊此視圖,


from rest_framework.routers import DefaultRouter


router = DefaultRouter()

router.register(r'order', OrderViewSet, basename='order')

urlpatterns = [


              ] + router.urls

因此,您將獲得該表中描述的基本 CRUD 端點(參見DefaultRouter參考文獻)。

讓您的訂單列表端點成為/foo-bar/order/

  1. HTTP POST 來/foo-bar/order/創(chuàng)建一個新實例

  2. HTTP PUT 或 HTTP PATCH/foo-bar/order/<ORDER_PK>/以更新內(nèi)容

筆記

在這種情況下,id如果您希望將現(xiàn)有的關(guān)系映射到Order

更新-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 PATCH


查看完整回答
反對 回復 2022-11-01
  • 1 回答
  • 0 關(guān)注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號