attributeError at/api/updateOrder/71'相关manager'对象没有属性'save'

问题描述 投票:0回答:1
Foreignkey

模型的许多关系中(与

Order
)有很多关系。此外,计费细节模型是与
Order
模型的一对一关系。我可以更新帐单详细信息字段和
Order
字段,但无法更新
OrderItem
字段。
我有一个错误的说法:

'relelatedManager'对象没有属性'save'

我的型号:

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') ...
django django-rest-framework postman save
1个回答
2
投票

instance.billing_details

将返回一个
BillingDetails
实例(如果有一个),因为它是一个
OneToOneField

,但是
instance.order_items
将返回相关的管理器,而不是一个实例。 solutions:

改变字段
OrderItem
;但是我不知道这是否适合您的用例,因此您必须详细分析它是否适合您。
OrderItem.order
(或

OneToOneField

)从相关的管理器中获取实例。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.