Django rest聚合验证

2024-06-09 06:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Ticket模型和一个Product模型,我想确保不可能将产品的可用票证数量更改为小于已经售出的票证数量。为了实现这一点,我在serializer update方法中使用聚合查询。你知道吗

但是,为了使用这个特定实例的聚合查询,您需要将pk设置为read_only=False(als tom christie自己建议:https://github.com/tomchristie/django-rest-framework/issues/2320)。然而,这又带来了另一个问题,因为现在我必须确保人们不可能更改pk。有没有人知道如何实现这一点或以另一种方式实现聚合验证,这样我就不必公开我的Product模型的pk?你知道吗

这是我的模型:

class Product(models.Model):
    name = models.CharField(max_length=50)
    amount = models.IntegerField()
    price = models.DecimalField(max_digits=5, decimal_places=2)

class Ticket(models.Model):
    buyername = models.CharField(max_length=50)
    buyeremail = models.EmailField(max_length=254)
    product = models.ForeignKey(Product,related_name='tickets')

这是我的产品序列化程序:

class ProductSerializer(serializers.HyperlinkedModelSerializer ):
    pk = serializers.IntegerField(read_only=False)
    name = serializers.CharField(min_length=3,max_length=50)
    amount = serializers.IntegerField(min_value = 0,max_value = 100)
    price = serializers.DecimalField(min_value=1.0,max_value=1001.0,max_digits=5, decimal_places=2)
    ticketssold = serializers.IntegerField(read_only=True)
    class Meta:
        model = Product

    def update(self, instance, validated_data):
        instance.amount = validated_data['amount']
        #get the amount of tickets sold
        filtered_data = Product.objects.filter(pk=validated_data['pk']).aggregate(Count('tickets'))
        if instance.amount < filtered_data['tickets__count']:
            raise serializers.ValidationError("It is not possible to update the amount of tickets to less tickets than there are sold!")
        instance.save()
        return instance

Tags: instance模型datavaluemodelsupdateproductamount