Python 更新Django Rest框架中的多个关系
在django应用程序中,订单和包之间有很多关系。一个订单可以有多个包。我想知道更新和创建方法 Models.pyPython 更新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
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?