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