Сериализуйте ответ как вложенное поле в django остальной структуре - PullRequest
0 голосов
/ 08 января 2020

Я пытался сделать вложенное json вместо плоского json. Я получаю,

{
    "field1": "value1",
    "field2": "value2" 
}

И я пытаюсь сделать как,

{
    "field1": "value1",
    "extra": {
        "x1" : "value2",
        "comment": "my comment"
    }
}

Моя модель проста,

class MyModel(BaseMeta):
    field1 = models.CharField(db_column='field1', primary_key=True, max_length=11)
    field2 = models.CharField(db_column='field2')

Сериализатор

class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2']

Решение состоит в следующем,

class MyModelSerializer(serializers.Serializer):
    extra = serializers.SerializerMethodField('get_extra')
    class Meta:
        model = CowMating
        fields = ['field1', 'extra']

    def get_extra(self, obj):
        return {
            'x1': obj.field2,
            'comment': 'my comments'
        }

Но мне интересно, возможно ли написать другой сериализатор, такой как

class ExtraSerializer(serializers.Serializer):
    x1 = serializers.CharField(source='field2')
    comment = "my comment"

, и сериализатор будет в ModelSerializer,

class MyModelSerializer(serializers.Serializer):
    extra = ExtraSerializer()
    class Meta:
        model = MyModel
        fields = ['field1', 'extra ']

Пожалуйста, дайте несколько советов. Заранее спасибо.

1 Ответ

0 голосов
/ 08 января 2020

Да, возможно, вы можете ссылаться на другой сериализатор в другом для вложенных данных, а также есть свойство django , которое вы можете использовать.

ваш путь

class MyModelSerializer(serializers.Serializer):
    extra = ExtraSerializer()
    class Meta:
        model = MyModel
        fields = ['field1', 'extra ']
        depth = 1 .    #<--- Add this

Свойство

models.py

Предположим, у вас есть две модели MyModel1 и MyModel2, которые имеют отношение Foreignkey с MyModel1.

class MyModel1(BaseMeta):
    field1 = models.CharField(db_column='field1', primary_key=True, max_length=11)
    field2 = models.CharField(db_column='field2')
    @property
    def mymodel2_prop(self, obj):
        from appname.serializer import MyModel2Serialzers    #you have to implement a simple serializer fro MyModel2 which is imported here.
        return MyModel2Serilzers(mymodel2_set.all()).data

Таким образом, вы импортируете сериализатор, который является необязательным, но хорошей практикой для проверки данных. используя обратную связь, вы используете set, чтобы получить соответствующие данные в MyModel1 API

class MyModel2(BaseMeta):
        some_field1 = models.ForeignKey(MyModel1, on_delete=models.CASCADE)

serializers.py

class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'mymodel2_prop '] 

Это дает вам представление, Код не проверен

...