Дисплей сериализатора Django BooleanField соответствующей модели - PullRequest
1 голос
/ 03 мая 2019

Контекст

У меня есть 2 модели: App & AppVersion.

Я пытаюсь сериализовать поля из AppVersion вместе с полем из модели App. Я не могу отобразить соответствующее поле в моем сериализаторе.

Цель

Моя цель состоит в том, чтобы ответ API включал в себя следующее поле:

[
    {
        "app_version_uuid": "61ee8efa-f79e-4fcd-a6ea-4a33544442e1",
        "app_version_name": "Test app version",
        "version_code": 2,
        "version_name": "0.2",
        "auto_start": True   # related field
    }
]

Модель

# models.py

class App(models.Model):
    app_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    app_name = models.CharField(max_length=100)
    package_id = models.CharField(max_length=100, unique=True, null=True, blank=True, editable=False)
    auto_start = models.BooleanField(default=False)  


class AppVersion(models.Model):
    app_version_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    app_uuid = models.ForeignKey(App, on_delete=models.CASCADE, related_name='app_versions')
    app_version_name = models.CharField(max_length=100)
    version_name = models.CharField(blank=True, null=True, max_length=100, editable=False)
    version_code = models.IntegerField(blank=True, null=True, editable=False)

сериализаторы

# serializers.py

class AppVersionSerializer(serializers.ModelSerializer):
    auto_start = serializers.SlugRelatedField(read_only=True, slug_field='auto_start')

    class Meta:
        model = AppVersion
        fields = ('app_version_uuid', 'app_version_name', 'version_code', 'version_name', 'auto_start')

Что я пробовал

Я пытался использовать SlugRelatedField(), как показано в моем serializers.py. Я также пытался использовать SerializerMethodField() как это:

# serializers.py

class AppSerializer(serializers.ModelSerializer):
    class Meta:
        model = App
        fields = ('auto_start')

class AppVersionSerializer(serializers.ModelSerializer):
    auto_start = serializers.SerializerMethodField(read_only=True)

    def get_auto_start(self, model):
        return AppSerializer(model).data

    class Meta:
        model = AppVersion
        fields = ('app_version_uuid', 'app_version_name', 'version_code', 'version_name', 'auto_start')

SlugRelatedField() не показывает auto_start в ответе.

Использование SerializerMethodField() auto_start отображается как:

"auto_start": {}

Что мне нужно изменить, чтобы получить соответствующее поле auto_start в моем ответе?

1 Ответ

3 голосов
/ 03 мая 2019

Используйте source аргумент вместе с BooleanField,

class AppVersionSerializer(serializers.ModelSerializer):
    auto_start = <b>serializers.BooleanField(source='app_uuid.auto_start')</b>

    class Meta:
        model = AppVersion
        fields = ('app_version_uuid', 'app_version_name', 'version_code', 'version_name', 'auto_start')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...