Python django rest框架中的多对多验证
我有三个模型,第一个是Activity,第二个是User,它们通过多对多关系相互链接,如下所示,最后一个是rating,其中包含Activity的外键,如下所示: models.pyPython 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
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()
方法,它将对接收到的数据运行默认验证