【发布时间】:2022-10-15 01:39:11
【问题描述】:
映射了多个表,当我创建发布请求时,
大约需要2~3秒。有什么办法可以解决吗?
我想这需要很长时间:
-
对象.create
-
for 循环
-
产品.objects.get
但是,我无法找到更好的方法..
楷模:
#product、Order、OrderItems、ShippingAddress 已映射
class Order(models.Model): user = models.ForeignKey(User, on_delete= models.CASCADE) order_date = models.DateTimeField(auto_now=True) is_paid = models.BooleanField(default=False) paid_at = models.DateTimeField(auto_now=False, null=True, blank=True) delivery_code = models.CharField(max_length=255, null=True, blank=True) is_delivered = models.BooleanField(default=False) delivered_date = models.DateTimeField(auto_now=False, null=True, blank=True) total_price = models.DecimalField(max_digits=7, decimal_places=2, null=True) shipping_price = models.DecimalField(max_digits=7, decimal_places=2, null=True) payment_method = models.CharField(max_length=255,null=True) def __str__(self): return str(self.user) class OrderItem(models.Model): order = models.ForeignKey(Order, on_delete= models.CASCADE, null=True, blank=True) product = models.ForeignKey(Product, on_delete= models.CASCADE) name = models.CharField(max_length=200, null=True) image = models.CharField(max_length=255, null=True) qty = models.IntegerField(default=0, null=True) price = models.DecimalField(max_digits=7, decimal_places=2, null=True) def image_preview(self): if self.image: return mark_safe('<img src="{0}" width="55" height="55" />'.format(self.image)) else: return '(No image)' def __str__(self): return str(self.product) class ShippingAddress(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) order = models.OneToOneField(Order, on_delete=models.CASCADE, null=True, blank=True) address = models.CharField(max_length=255, null=False) city = models.CharField(max_length=255, null=False) postal_code = models.CharField(max_length=255, null=False) country = models.CharField(max_length=255, null=False) def __str__(self): return str(self.user)看法:
@permission_classes(IsAuthenticated) @api_view(['POST']) def OrderCreate(request): data = request.data user = request.user order_items = data['orderItems'] #1.create order order = Order.objects.create( user = user, total_price = data['totalPrice'], shipping_price = data['shippingPrice'], payment_method = data['paymentMethod'] ) #2.create orderItems for i in order_items: product = Product.objects.get(id=i['id']) order_item = OrderItem.objects.create( order = order, product = product, name = i['name'], qty = i['qty'], price = i['price'], image = i['image'] ) #3. update stock product.stock -= i['qty'] product.save() #4.create shipping address shipping_address = ShippingAddress.objects.create( user = user, order = order, address = data['shippingAddress']['address'], city = data['shippingAddress']['city'], postal_code = data['shippingAddress']['postalCode'], country = data['shippingAddress']['country'], ) #5.serializing and save serializer = OrderSerializer(order, many=False) return Response(serializer.data)
【问题讨论】:
-
在 for 循环中访问数据库不是一个好主意。您可以分别用
Q过滤器和bulk_update替换视图函数for 循环中的product = Product.objects.get(id=i['id'])和product.save()行,并摆脱for 循环。 -
你能分享这个数据列表吗
order_items我对结构感到困惑。
标签: django django-rest-framework