Как валидировать поля с внешними ключами в контексте сериализаторов?
Я работаю над некоторыми валидациями, и хочу проверить, ссылается ли введенное значение 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