Django указать вручную поля для включения как вложенные JSON - PullRequest
0 голосов
/ 25 февраля 2020

С помощью django -rest-framework я создаю REST API, где я могу получать доступ и изменять информацию о людях в городе. Люди принадлежат городу и поэтому имеют внешний ключ, связанный с моделью города.

С помощью приведенного ниже кода я сериализую объект Person вместе с объектом City, в результате чего получается вложенный JSON. Однако, поскольку это упрощенный пример кода, а в реальном проекте гораздо больше данных и полей, а вложение углубляется, в конечном итоге он значительно замедляет API, особенно при доступе ко всем записям Person.

Is есть ли способ указать, хочу ли я включить вложенную сериализацию или просто хочу модель мелкого человека с идентификаторами первичного ключа?

class City(models.Model):
    name = models.CharField(max_length=255, unique=True)


class Person(models.Model):
    name = models.CharField(max_length=384)
    city = models.ForeignKey(City, on_delete=models.CASCADE)


class CitySerializer(serializers.ModelSerializer):
    class Meta:
        model = City
        fields = '__all__'


class PersonSerializer(serializers.ModelSerializer):
    city = CitySerializer()

    class Meta:
        model = Person
        fields = '__all__'

class PersonViewSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

urls.py:

router = routers.DefaultRouter()
router.register('people', PersonViewSet)

запрашивая данные: curl -i -H "Принять: application / json" 'localhost: 8000 / people'

JSON :

[
    {
        "id": 1,
        "name": "Simen",
        "city": {
            id: 1,
            name: "Oslo"
        }
    },
    {
        "id": 2,
        "name": "Roar",
        "city": {
            id: 2,
            name: "Trondheim"
        }
    }
]

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете сделать два отдельных сериализатора. Один из них вызывается, когда вы хотите использовать вложенный объект, а другой - когда нет. Если вы не хотите использовать вложенный объект, задайте для поля города нового сериализатора персона-человека идентификатор города.

...