Как я могу сериализовать None из базы данных в объект empyt?

У меня есть следующие модели:

class ContentUpload(BaseModel):
    ...
    status = models.ForeignKey(CourseStatus, on_delete=models.CASCADE, related_name="content_status", null=True, blank = True)
class CourseStatus(BaseModel):
    status_name = models.CharField(max_length=250)
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.status_name)
        super(CourseStatus, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.status_name)

Следующие сериализаторы:

class CourseStatusListSerializers(serializers.ModelSerializer):
    class Meta:
        model = CourseStatus
        fields = ('id', 'status_name', 'slug')
    def get_status(self, obj):
        return CourseStatusListSerializers(obj.status, context={"request": self.context['request']}).data

Когда ContentUpload.status равен None, возвращается следующее:

"status":{"status_name":"","slug":""}

Мой вопрос в том, как я могу сделать это, чтобы вернуть пустой объект? Какова ваша лучшая практика для этого?

"status":{}

1- Перепишите ваше ContentUploadSerializer на следующее:

class ContentUploadSerializer(serializers.ModelSerializer):
    status = CourseStatusListSerializers(required=False)
    class Meta:
        model = ContentUpload
        fields = ('id', 'status',)

2- Удалите метод get_status.

Сериализованный объект ContentUpload с полем status None будет выглядеть следующим образом:

  {
    "id": 2,
    "status": null
  }

А с полем status не None это будет:

  {
    "id": 1,
    "status": {
      "id": 1,
      "status_name": "Pending",
      "slug": "pending"
    }
  }

Подробнее о вложенных сериализаторах вы можете прочитать на этой странице. https://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

Вернуться на верх