Python Django rest聚合验证

Python Django rest聚合验证,python,django,rest,django-rest-framework,aggregate,Python,Django,Rest,Django Rest Framework,Aggregate,我有一个票证模型和一个产品模型,我想确保不可能将该产品的可用票证数量更改为小于已经售出的票证数量。为了实现这一点,我在序列化程序更新方法中使用聚合查询 但是,为了使用此特定实例的聚合查询,您需要将pk设置为read_only=False als tom christie自己建议的:。然而,这带来了另一个问题,因为现在我必须确保人们不可能更改pk。是否有人知道如何实现这一点或以另一种方式实现聚合验证,以便我不必公开我的产品模型的pk 这是我的模型: class Product(models.Mod

我有一个票证模型和一个产品模型,我想确保不可能将该产品的可用票证数量更改为小于已经售出的票证数量。为了实现这一点,我在序列化程序更新方法中使用聚合查询

但是,为了使用此特定实例的聚合查询,您需要将pk设置为read_only=False als tom christie自己建议的:。然而,这带来了另一个问题,因为现在我必须确保人们不可能更改pk。是否有人知道如何实现这一点或以另一种方式实现聚合验证,以便我不必公开我的产品模型的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

我可能错了,但是read_only=False不是只关注列表序列化程序吗?您无法从instance.pk获取pk?甚至是访问实例。票证?确实不可能直接访问它。但是因为您将read_only设置为False,所以它确实会被传递到字典验证日期中。正如您在我的代码中看到的,您可以使用pk=validated_data['pk']检索它