Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django rest框架中的多对多验证_Python_Django_Python 3.x_Django Rest Framework_Postman - Fatal编程技术网

Python django rest框架中的多对多验证

Python django rest框架中的多对多验证,python,django,python-3.x,django-rest-framework,postman,Python,Django,Python 3.x,Django Rest Framework,Postman,我有三个模型,第一个是Activity,第二个是User,它们通过多对多关系相互链接,如下所示,最后一个是rating,其中包含Activity的外键,如下所示: models.py class Activity(models.Model): name = models.CharField(blank=True, unique=True, max_length=100) rating_average = models.FloatField(blank=True, null=Tr

我有三个模型,第一个是Activity,第二个是User,它们通过多对多关系相互链接,如下所示,最后一个是rating,其中包含Activity的外键,如下所示:

models.py

class Activity(models.Model):

    name = models.CharField(blank=True, unique=True, max_length=100)
    rating_average = models.FloatField(blank=True, null=True, default=0, max_length=1)
    members = models.ManyToManyField(User, blank=True, related_name='activitymembers')



class ActivityRating(models.Model):
    activity = models.ForeignKey(Activity, related_name='activity', on_delete=models.CASCADE, blank=True, null=True)
    rate = models.IntegerField(blank=True, null=True, default=0)
    created_by = models.ForeignKey(User, related_name='rate_user', blank=True, null=True, on_delete=models.CASCADE)
序列化程序.py

class ActivityRateSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        created_by = kwargs['context']['request'].user
        super(ActivityRateSerializer, self).__init__(*args, **kwargs)
        self.fields['created_by'].queryset = User.objects.filter(id=created_by.id)

    class Meta:
        model = ActivityRating
        fields = ['id', 'activity', 'rate', 'created_by']
    def create(self, validated_data):

        obj = ActivityRating.objects.create(**validated_data)
        obj.save()
        return obj
它的工作很好,但我需要的是:如何添加验证器,使评级是不可能的,除非你是活动的成员

请任何人都有办法帮我


谢谢

您可以通过将序列化程序的方法重写为

class ActivityRateSerializer(serializers.ModelSerializer):
    created_by = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), default=serializers.CurrentUserDefault())

    def validate(self, attrs):
        attrs = super(ActivityRateSerializer, self).validate(attrs)  # calling default validation
        if not Activity.objects.filter(members=self.context['request'].user).exists():
            raise serializers.ValidationError("your validation error")
        return attrs

    class Meta:
        model = ActivityRating
        fields = ['id', 'activity', 'rate', 'created_by']
类ActivityRateSerializer(serializers.ModelSerializer):
创建的\u by=serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),default=serializers.CurrentUserDefault())
def验证(自身、属性):
attrs=super(ActivityRateSerializer,self).validate(attrs)#调用默认验证
如果不是,则为Activity.objects.filter(members=self.context['request'].user).exists():
引发序列化程序。ValidationError(“您的验证错误”)
返回属性
类元:
模型=活化
字段=['id'、'activity'、'rate'、'created_by']


我已经修改了您的大部分代码,因为DRF提供了从上下文中提取请求用户的功能,方法是使用


另外,您的
create()
方法在这里是不相关的,因为它与原始逻辑没有任何不同

是否需要调用
attrs=super(ActivityRateSerializer,self).validate(attrs)
?这不是默认行为吗?通过调用
super()
方法,它将对接收到的数据运行默认验证