Как валидировать поля с внешними ключами в контексте сериализаторов?

Я работаю над некоторыми валидациями, и хочу проверить, ссылается ли введенное значение requesterid на значение userroleid "3" из модели userTable. Если оно не соответствует критериям, то будет выдана ошибка валидации. Как я могу получить доступ к полю из таблицы со ссылкой?

Я пробовал что-то вроде request = self.context.get("requesterid__userroleid"), но это не подтверждает правильность. Есть ли у вас идеи, как это сделать?

Вот мои сериализаторы:

class RequestCreateSerializer(serializers.ModelSerializer):
    parts=PartSerializer(many=True) 
    class Meta: model = requestTable 
    fields = ['rid', 'requesterid', (...)]
    
    def create(self, validated_data): 
        (...)
    
    def validate(self, data): 
    request = self.context.get("requesterid__userroleid") #how to access userroleid? if request == 3: 
        return data
    raise serializers.ValidationError("Sorry! Your role has no permission to create a request.")

Вот мои взгляды:

class RequestListCreateView(ListCreateAPIView): queryset = requestTable.objects.all() serializer_class = RequestCreateSerializer

def create(self, request, *args, **kwargs):
(...)

def get_serializer(self, *args, **kwargs):

    serializer_class = self.get_serializer_class()
    kwargs['context'] = self.get_serializer_context()
    return serializer_class(*args, **kwargs)    

def get_serializer_context(self):
    return {
        'request': self.request,
        'format': self.format_kwarg,
        'view': self
    }

Вот мои модели:

class requestTable(models.Model):
rid = models.AutoField(primary_key=True)    
requesterid =  models.ForeignKey(userTable, on_delete=models.CASCADE)
(...)

class userTable(models.Model):
userid = models.UUIDField(primary_key=True, default = uuid.uuid4, editable=False) userroleid = models.ForeignKey(roleTable, on_delete=models.CASCADE)

class roleTable(models.Model):
roleid = models.IntegerField(null=False, primary_key=True)
role = models.CharField(max_length=255, null=False)

Решил эту проблему с помощью следующего кода:

def validate(self, data):
    if data['requesterid'].userroleid_id != 3:
        raise serializers.ValidationError("Sorry! You entered a user with no requester permissions.")
    return data
Вернуться на верх