django - AttributeError at/api/updateorder/71 'RelatedManager' 对象没有属性 'save'

标签 django api django-rest-framework save postman

我正在尝试为订单对象制作更新 api。 OrderItem 模型与 Order Model 处于多对一关系(使用外键)。此外,账单明细模型与订单模型是一对一的关系。我可以更新“帐单详细信息”字段和“订单”字段,但无法更新“订单项”字段。

我收到此错误,提示“RelatedManager”对象没有“保存”属性

我的模型:

class Order(models.Model):
    ORDER_STATUS = (
        ('To_Ship', 'To Ship',),
        ('Shipped', 'Shipped',),
        ('Delivered', 'Delivered',),
        ('Cancelled', 'Cancelled',),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)    
    order_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')

    ordered_date = models.DateTimeField(auto_now_add=True)
    ordered = models.BooleanField(default=False)
    total_price = models.CharField(max_length=50,blank=True,null=True)
    #billing_details = models.OneToOneField('BillingDetails',on_delete=models.CASCADE,null=True,blank=True,related_name="order")

    def __str__(self):
        return self.user.email

    class Meta:
        verbose_name_plural = "Orders"
        ordering = ('-id',)

class OrderItem(models.Model):
    #user = models.ForeignKey(User,on_delete=models.CASCADE, blank=True)
    order = models.ForeignKey(Order,on_delete=models.CASCADE, blank=True,null=True,related_name='order_items')
    item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
    order_variants = models.ForeignKey(Variants,on_delete=models.CASCADE,blank=True,null=True)
    quantity = models.IntegerField(default=1)
    # def price(self):
    #     total_item_price = self.quantity * self.item.varaints.price
    #     return total_item_price
    total_item_price = models.PositiveIntegerField(blank=True,null=True,)
    

    def __str__(self):
        return f"{self.quantity} items of {self.item} of {self.order.user}"

    class Meta:
        verbose_name_plural = "Cart Items"
        ordering = ('-id',)

class BillingDetails(models.Model):
    PAYMENT_TYPE = (
        ('cash_on_delivery', 'Cash On Delivery',),
        ('credit/debit_card', 'Credit/Debit Card',),
        ('connect_ips', 'Connect IPS',),
        ('fonepay', 'Fonepay',),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    order = models.OneToOneField(Order, on_delete=models.CASCADE, blank=True, null=True, related_name='billing_details')  
    address = models.CharField(max_length=100,blank=True,null=True)
    postal = models.CharField(max_length=50,blank=True,null=True)
    payment_type = models.CharField(max_length=50,blank=True,null=True,choices=PAYMENT_TYPE,default='cash_on-delivery')
    def __str__(self):
        return self.address

    class Meta:
        verbose_name_plural= "Shipping Address"

我的观点:

class UpdateOrderView(UpdateAPIView):
    permission_classes = [AllowAny]
    queryset = Order.objects.all()
    serializer_class = OrderUpdateSerializer

我的序列化器:

class OrderUpdateSerializer(serializers.ModelSerializer):
    order_items = OrderItemSerializer(many=True)
    billing_details = BillingDetailsSerializer()

    class Meta:
        model = Order
        fields = ['ordered','order_status','order_items','billing_details']


    def update(self, instance, validated_data):
        instance.order_status = validated_data.get('order_status')
        instance.ordered = validated_data.get('ordered')

        billing_details_data = validated_data.pop('billing_details',None)
        if billing_details_data is not None:
            instance.billing_details.address = billing_details_data['address']
            instance.billing_details.save() #no-error here


        order_items_data = validated_data.pop('order_items')
        for order_items_data in order_items_data:
            instance.order_items.quantity = order_items_data['quantity']
            instance.order_items.order_item_status = order_items_data['order_item_status']
            instance.order_items.save() #got the error here
            #super(OrderUpdateSerializer, self).update(instance.order_items,validated_data).save()
        #super().save()
        

        return super().update(instance,validated_data)

instance.billing_details.save() 中没有错误,但相同的代码 instance.order_items.save() 会生成上述错误。如果我删除 instance.order_items.save(),那么它可以工作,但不会将更新的数据保存在数据库中。

最佳答案

您在一个模型中使用 OneToOneField,而在另一个模型中使用 ForeignKey,因此您不能对这两个模型使用相同的代码。

class OrderItem(models.Model):
    ...
    order = models.ForeignKey(..., related_name='order_items')
    ...
 
class BillingDetails(models.Model):
    ...
    order = models.OneToOneField(..., related_name='billing_details')  
    ...

instance.billing_details 将返回一个 BillingDetails 实例(如果有的话),因为它是一个 OneToOneField,但是 instance .order_items 将返回 OrderItem 的相关管理器,而不是实例。

解决方案:

  1. 将字段 OrderItem.order 更改为 OneToOneField;但我不知道这是否适合您的用例,因此您必须详分割析它是否适合您。

  2. instance.order_items.first()(或instance.order_items.get(...))从相关管理器获取实例。

关于django - AttributeError at/api/updateorder/71 'RelatedManager' 对象没有属性 'save',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66812023/

相关文章:

python - Django DisallowedModelAdminLookup 用于在 Admin list_filter 中查找

python - 带 Tweepy 的 StreamListener,TypeError

Django模板如何对简单标签返回的结果应用过滤器

django - mongo_aggregate() 的 Djongo 映射器问题

django - 如何在 Django 的自定义 404 错误模板中显示传递给 Http404 的消息?

python - 使用通用 View 的 django rest 框架电子邮件验证

python - 如何自定义 Django 模型的 python 端?

javascript - 尝试检索经过身份验证的 Google+ 用户的电子邮件地址时获取 "gapi.client is undefined"

JavaScript异步函数: callback not working

django-rest-framework - 如何使用 drf_yasg 显示排序