Reputation: 6133
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
Upvotes: 2
Views: 2284
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
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