Как получить доступ к полю другой таблицы через внешний ключ в Django?

Я на чем-то застрял. Как я могу получить доступ к userroleid из моего validatorid внешнего ключа? Я пытаюсь сделать валидацию на уровне сериализатора. Я пробовал что-то вроде data['validatorid__userroleid'], но это приводит к ошибке. Надеюсь, кто-нибудь сможет мне помочь!

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

class ValidatorPartSerializer(serializers.ModelSerializer):
    class Meta:
        model = partsTable
        fields = ['pid', 'partsid', 'validatorid', (...)]
        read_only_fields = ['pid', 'partsid',(...)]
​
    def validate(self, data):
        if data['validatorid'] != 2: #how can I access userroleid from here?
            raise serializers.ValidationError("Sorry! You entered a user with no validator permissions.")
        return data
​
    def update(self, instance, validated_data):
        instance.validatorid = validated_data.get('validatorid', instance.validatorid)
        instance.partsstatusid = validated_data.get('partsstatusid', instance.partsstatusid)
        instance.save()            
        return instance

Вот моя модель для справки:

class partsTable(models.Model):
​
    pid = models.AutoField(primary_key=True)
    partsid = models.CharField(max_length=15, null=True)
    validatorid = models.ForeignKey(userTable, on_delete=models.CASCADE, null=True, blank=True)
    (...)
​
class userTable(models.Model):
    userid = models.UUIDField(primary_key=True, default = uuid.uuid4, editable=False)
    username = models.CharField(max_length=50, null=False, unique=True)
    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)

Думаю, вам стоит переименовать поля внешнего ключа, возможно, это поможет понять, как работает Django:
validatorid >> validator || userroleid >> user_role

Тогда внутри вашего кода вы можете сделать:

class ValidatorPartSerializer(serializers.ModelSerializer):
    class Meta:
        model = partsTable
        fields = ['pid', 'partsid', 'validator', (...)]
        read_only_fields = ['pid', 'partsid',(...)]
​
    def validate(self, data):
        try:
          user = userTable.objects.get(validator_id=data['validator'])
        except userTable.DoesNotExist:
          raise serializers.ValidationError("No user exists for this validator_id")
        if user.user_role.role_id != 2:
            raise serializers.ValidationError("Sorry! You entered a user with no validator permissions.")
        return data

Итак, я предлагаю вам получить пользователя из базы данных, затем получить доступ к идентификатору роли через отношения

Вернуться на верх