Pratibha
Pratibha

Reputation: 1786

DRF: validate a field from another table

I have created an API to upload the file. Now I want to add few checks before user can upload it. So in payload I am asking his email and token to validate him.

Now email and token are in separate table. How can I validate them. I am getting errors like

TypeError: 'email' is an invalid keyword argument for this function

my models file

class File(models.Model):

    filename = models.FileField(blank=False, null=False,upload_to='files')
    remark = models.CharField(max_length=20)
    timestamp = models.DateTimeField(auto_now_add=True)

my serializer file

class FileSerializer(serializers.ModelSerializer):

    token = serializers.CharField(label=_("Token"))
    email = serializers.CharField(label=_('email'))

    def validate(self, attrs):
        print("validating params")
        token = attrs.get('token')
        email= attrs.get('email')

        validate(token, email)
        return attrs

    class Meta():
        model = File
        fields = ('filename', 'remark', 'timestamp', 'token', 'email')
        read_only_fields = ('token', 'email')

Upvotes: 0

Views: 292

Answers (1)

Ehsan Nouri
Ehsan Nouri

Reputation: 2040

you only want email and token when creating a file(uploading) and also they are not fields in your model, so you should make them write_only and also you should override the create method in serializers and pop them out before saving into the model.

 class FileSerializer(serializers.ModelSerializer):

    token = serializers.CharField(label=_("Token"), write_only=True)
    email = serializers.CharField(label=_('router_macid'), write_only=True)

    def validate(self, attrs):
        print("validating params")
        token = attrs.get('token')
        email= attrs.get('email')

        validate(token, email)
        return attrs

    def create(self, validated_data):
        validated_data.pop('email', None)
        validated_data.pop('token', None)
        return super().create(validated_data)



    class Meta():
        model = File
        fields = ('filename', 'remark', 'timestamp', 'token', 'email')

Upvotes: 1

Related Questions