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
Вернуться на верх