简体   繁体   English

django rest 框架:如何使用相关字段验证序列化程序中的规则

[英]django rest framework: How to validate a rule in serializers using a related field

I have these models:我有这些模型:

product.py产品.py

class Product(models.Model):
    product_title = models.CharField(max_length=100)
    product_price = models.DecimalField(max_digits=12, decimal_places=2)
    product_multiple = models.PositiveIntegerField(blank=True, null=True)

order_item.py订单项.py

class OrderItem(models.Model)
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items', null=True, blank=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    price = models.FloatField(default=0)
    quantity = models.BigIntegerField(default=1)
    profitability = models.CharField(max_length=50, null=True, blank=True)

I want to validate in serializers.py if the order_item.quantity % product_multiple != 0我想在serializers.py验证order_item.quantity % product_multiple != 0

serializers.py序列化程序.py

class OrderItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = OrderItem
        fields = ('id', 'order', 'product', 'price',
                  'quantity', 'profitability')

    def validate_quantity(self, value):
        data = self.get_initial()
        quantity = data.get("quantity")

        # This is where the `product.product_multiple` value is needed
        if int(quantity) % product.product_multiple != 0:
            raise serializers.ValidationError("Quantity is not multiple")

        return value

How can I get the actual product_multiple inside the validate function?如何在验证函数中获取实际的product_multiple

As you are doing a validation that involves multiple fields, you should use the validate method as follows:当您进行涉及多个字段的验证时,您应该使用validate方法,如下所示:

def validate(self, data):
    quantity = data.get('quantity')
    product = data.get('product')

    if int(quantity) % product.product_multiple != 0:
        raise serializers.ValidationError("Quantity is not multiple")
    return value

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM