【问题标题】:How to fetch data from other table django rest framework如何从其他表 django rest 框架中获取数据
【发布时间】:2020-09-14 05:42:29
【问题描述】:

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

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

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']

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

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

    【讨论】:

    • 抱歉,我无法检查代码。我已经编辑了我的答案。错误是序列化程序中的字段名称。我通常在ForeignKey 字段中设置相关名称,因为它更容易编写。要了解有关相关名称的更多信息,请查看stackoverflow.com/a/2642645/13022138。感谢您的更新!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2015-12-07
    • 2017-06-03
    相关资源
    最近更新 更多