如何从其他 table django rest 框架获取数据

How to fetch data from other table django rest framework

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

我尝试了很多但没有成功。任何人都会请帮助我。

views.py

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

models.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', on_delete=models.SET_NULL, null=True, 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, choices=status_choice, 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)

serializers.py

class OfflineSerializer(serializers.ModelSerializer):
    def total(self, obj):
        return obj.total
    total = serializers.IntegerField(read_only=True)
    cartitems = CartItemSerializer( read_only=True, many=True)
    class Meta:
        model = OfflineCheckOut
        fields = ['user', 'billing_name','billing_phone_no','cartitem', 'cartitems','cart', 'date', 'time_slot', 'address', 'total']
        extra_fields = ['total', 'cartitems']

您必须将它们放入 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