Как получить json-ответ, в котором атрибуты находятся под другим 'set attribute' (см. пример)?

Я новичок в Django API. Я разрабатываю api, где ответ будет выглядеть следующим образом после запроса сообщения:

{ "set_attributes": { "name": "some value", "возраст": "другое значение". }, }

В настоящее время мой ответ выглядит следующим образом:

{
  "Name": "some value",
  "age": "another value"
}

Следует отметить, что я использую представления на основе классов, а для форм я использую модели Django. Я не выводил никаких html-форм.

serializers.py:

class ContactSerializer(serializers.ModelSerializer):

    Name = serializers.CharField(max_length=100)
    Birthdate = serializers.DateField(default=datetime.now())

    class Meta:
        model = Contact
        fields = ('Name', 'Birthdate', 'age')

class ListingSerializer(serializers.ModelSerializer):
    age = serializers.Field(source='age')

models.py

class Contact(models.Model):

    Name = models.CharField(max_length=100)

    Birthdate = models.DateField(default=datetime.now())

    age = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        if self.Birthdate > date.today():
            raise ValidationError("The date cannot be in the future!")
        super(Contact, self).save(*args, **kwargs)

    @property
    def age(self):
        today = date.today()
        birth = self.Birthdate
        newage = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
        return newage

    def __str__(self):
        return self.Name

views.py

class ContactList(generics.ListCreateAPIView):

    queryset = Contact.objects.all()
    serializer_class = ContactSerializer

class ContactDetail(generics.RetrieveUpdateDestroyAPIView):

    queryset = Contact.objects.all()
    serializer_class = ContactSerializer

Вы можете попробовать метод to_representation() для отображения ваших атрибутов во вложенном json под другим атрибутом.

Для этого вам нужно отредактировать ваш views.py, добавив метод to_representation() в таком порядке:

class ContactSerializer(serializers.ModelSerializer):

Name = serializers.CharField(max_length=100)
Birth_year = serializers.IntegerField(default=2022)

class Meta:
    model = Contact
    fields = ('Name','Birthdate','age')

def to_representation(self, instance):
    response = {
        "set_attributes" : super().to_representation(instance),
    }
    return response

 class ListingSerializer(serializers.ModelSerializer):
 age = serializers.Field(source='age')

Выполнение метода .to_representation(self, value) принимает цель поля в качестве аргумента value и должно возвращать представление, которое должно использоваться для сериализации цели. Аргумент value обычно представляет собой экземпляр модели.

Вот вывод:

{ "set_attributes" :

 {
   "name": "some value",
   "Birthdate": 2005/4/24,
   "age": 17
 },
}

Надеюсь, это помогло.

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