Khant Thu Linn
Khant Thu Linn

Reputation: 6133

Django serialize optional field

I am beginner to Django. Currently, I can serialize like this.

Serializer(serializers.ModelSerializer):

    sound_url = serializers.SerializerMethodField('get_sound_url')

    class Meta:
        model = Dialogue
        fields = ('id','english', 'sound_url') 

    def get_sound_url(self, dialogue):
        request = self.context.get('request')
        sound_url = dialogue.sound.url
        return request.build_absolute_uri(sound_url)

Model

class Dialogue(models.Model):
    owner = models.ForeignKey(User)
    english = models.TextField(max_length=400000)
    sound = models.FileField(upload_to='dialogues',blank=True, null=True)
    updated = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s' % (self.english)

However, since it is optional field, it show error like this.

I have read this also. But, I am not sure how to apply for my case. How shall I do?

Django REST Framework - Serializing optional fields

enter image description here

Upvotes: 2

Views: 2284

Answers (2)

vsimkus
vsimkus

Reputation: 337

Create a check in your get_sound_url method, for when sound is None, before trying to access the sound.url field.

def get_sound_url(self, dialogue):
     if not dialogue.sound:
        return None
     request = self.context.get('request')
     sound_url = dialogue.sound.url
     return request.build_absolute_uri(sound_url)

And then, Django REST framework serializers can have a field allow_null. Try setting it to true, and check:

sound_url = serializers.SerializerMethodField(method_name='get_sound_url', allow_null=true)

Upvotes: 0

Martin B.
Martin B.

Reputation: 1928

You need to account for the possibility of dialogue.sound being None, so try something like:

def get_sound_url(self, dialogue):
    if not dialogue.sound:
        return ''
    request = self.context.get('request')
    return request.build_absolute_uri(dialogue.sound.url)

Upvotes: 3

Related Questions