问题描述
我有一个cartmodel,cartitem和offlinecheckout模型。我想显示cartitem而不是cartmodel id,我想显示所有具有cart_id = offlinecheckout cart_id的Cartitem数据。但是我得到了这个答复。
我尝试了很多但是没有得到。任何人都请帮助我。
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