如何从其他表Django Rest框架获取数据

问题描述

我有一个cartmodel,cartitem和offlinecheckout模型。我想显示cartitem而不是cartmodel id,我想显示所有具有cart_id = offlinecheckout cart_id的Cartitem数据。但是我得到了这个答复。

我尝试了很多但是没有得到。任何人都请帮助我。

I got this result

views.py

validates :name,format: { with: /\A[a-zA-Z_ ]{2,30}\z/,message: ":can contain only alphabets,underscores and spaces" },on: :create

models.py

class GetAPI(APIView):
    def get(self,request,*args,**kwargs):
        serializer = Offlineserializer()
        return Response(serializer.data)

serializers.py

class OfflineCheckOut(models.Model):
    billing_name = models.CharField(max_length=254)
    billing_phone_no = models.CharField(max_length=15)
    user = models.ForeignKey('accounts.User',on_delete=models.CASCADE)
    cart = models.ForeignKey('cart.CartModel',on_delete=models.CASCADE)
    cartitem = models.ManyToManyField(CartItem,blank=True)
    # time_slot = models.ForeignKey('category.TimeSlot',on_delete=models.CASCADE)
    address = models.ForeignKey('cart.CustomerAddress',on_delete=models.CASCADE)
    status_choice = [
        ('0','Offline'),('1','Online')
    ]
    status = models.CharField(max_length=3,choices=status_choice,default=0)
    # date = models.DateField()
    date = models.DateField()
    time_slot = models.ForeignKey('category.TimeSlot',on_delete=models.SET_NULL,null=True,blank=True)
    order_id = models.CharField(max_length=254,blank=True)
    # date = models.DateField()
    razorpay_payment_id =models.CharField(max_length=254,blank=True)
    razorpay_signature = models.CharField(max_length=254,blank=True)
    paid = models.BooleanField(default=False)
    service = models.ForeignKey('service.ServiceProvider',blank=True)

class CartModel(models.Model):
    user = models.ForeignKey('accounts.User',on_delete=models.CASCADE)
    status_choice = [
        ('1','open'),('2','closed')
    ]
    status = models.CharField(max_length=2,default=1)
    validated = models.BooleanField(default=False)

    
    def __str__(self):
        return self.user.username
    
    @property
    def total_price(self):
        return self.cartitem_set.aggregate(
            total_price=Sum(F('quantity') * F('price'))
        )['total_price'] or Decimal('0')
 


class CartItem(models.Model):
    cart = models.ForeignKey('CartModel',on_delete=models.CASCADE)
    user = models.ForeignKey('accounts.User',on_delete=models.CASCADE)
    service = models.ForeignKey('accounts.SubCategory',on_delete=models.CASCADE)
    defects = models.ForeignKey('category.defects',on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    price = models.IntegerField()
    created_on = models.DateTimeField(auto_Now_add=True)
    updated_on = models.DateTimeField(auto_Now_add=True)
    order_placed = models.BooleanField(default=False)

解决方法

您必须将它们放入CartModel的序列化器中。然后OfflineSerializer会将其用于cart字段。

class CartModelSerializer(serializers.ModelSerializer):
    cartitem_set = CartItemSerializer(read_only=True,many=True)

    class Meta:
        model = CartModel
        fields  = [
            "cartitems_set",# other fields here
        ]


class OfflineSerializer(serializers.ModelSerializer):
    def total(self,obj):
        return obj.total
    total = serializers.IntegerField(read_only=True)
    cart = CartModelSerializer(read_only=True)

    class Meta:
        model = OfflineCheckOut
        fields = ['user','billing_name','billing_phone_no','cartitem','cartitems','cart','date','time_slot','address','total']
        extra_fields = ['total','cartitems']

编辑:将相关名称序列化程序从cartlineitems_set更改为cartlineitem_set