BooleanField сериализатора DRF возвращает null для пустого поля ForeignKey
Я хочу добавить булевы поля has_video и has_gallery в мой сериализатор.
Их значения должны быть true, если поля ForeignKey модели MyModel (video, gallery) имеют значения, иначе эти значения должны быть установлены в false.
models.py
class MyModel(models.Model):
video = models.ForeignKey(
to='videos.Video',
null=True,
blank=True,
on_delete=models.SET_NULL,
)
gallery = models.ForeignKey(
to='galleries.Gallery',
null=True,
blank=True,
on_delete=models.SET_NULL,
)
serializers.py
class MyModelSerializer(serializers.ModelSerializer):
has_video = serializers.BooleanField(source='video', default=False)
has_gallery = serializers.BooleanField(source='gallery', default=False)
Проблема возникает, когда значение video или gallery объекта MyModel равно null. Я ожидаю, что возвращаемое значение будет false, но оно равно null.
"has_video": null,
"has_gallery": null,
Я пытаюсь установить allow_null параметры в false, но результат тот же (значения по-прежнему null).
has_video = serializers.BooleanField(source='video', default=False, allow_null=False)
has_gallery = serializers.BooleanField(source='gallery', default=False, allow_null=False)
Когда видео или галерея не равны null, поля сериализатора возвращают true, как я и ожидал. Проблема заключается только в значениях null/false.
Этот подход я использовал в одном из своих проектов.
class MyModelSerializer(serializers.ModelSerializer):
has_video = serializers.SerializerMethodField('get_has_video', read_only=True)
has_gallery = serializers.SerializerMethodField(source='get_has_gallery', read_only=True)
# ... Your other fields
class Meta:
model = "Your model name"
fields = ("your model fields",
,"has_video", "has_gallery") # include the above two fields
def get_has_video(self, obj):
# now your object should be having videos then you want True so do this like this
return True if obj.video else False
def get_has_gallery(self, obj):
# now your object should be having galleries then you want True so do this like this
return True if obj.gallery else False