много-много проверок в рамках отдыха django - PullRequest
0 голосов
/ 11 октября 2018

У меня есть три модели: сначала «Активность», а затем «Пользователь», и они связаны друг с другом следующим образом, а последняя - это рейтинг, который имеет внешний ключ от действия следующим образом:

модели.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)

serializer.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

он отлично работает, но мне нужно следующее: как добавить валидатор, который делает рейтинг невозможным, если вы не участвуете в деятельности

пожалуйста, у любого есть решение, помогите мне,

спасибо

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете сделать это, переопределив метод validate() сериализатора как,

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

    <b>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</b>

    class Meta:
        model = ActivityRating
        fields = ['id', 'activity', 'rate', 'created_by']



Я изменил большую часть вашего кода, потому что DRF предоставляет возможность извлекать requested user из контекста, используя CurrentUserDefault() вместе с PrimaryKeyRelatedField()

Кроме того, ваш create() метод здесь не имеет значения, поскольку он не делает ничего отличного оторигинальная логика

...