anastasia
anastasia

Reputation: 45

How to validate fields with foreign keys in serializers context?

I'm working on some validations, and I want to check whether the requesterid entered is referencing to a userroleid value of "3" from userTable model. If it doesn't meet the criteria, it will raise a validation error. How can I access a field from a referenced table?

What I have tried is something like request = self.context.get("requesterid__userroleid") but it doesn't validate correctly. Do you have any idea on how to do this?

Here's my serializers:

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.")

Here's my views:

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
    }

Here's my models:

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)

Upvotes: 1

Views: 377

Answers (1)

anastasia
anastasia

Reputation: 45

Solved it using this code:

def validate(self, data):
    if data['requesterid'].userroleid_id != 3:
        raise serializers.ValidationError("Sorry! You entered a user with no requester permissions.")
    return data

Upvotes: 1

Related Questions