Django Rest Framework пользовательский сериализатор данных

Я получил ответ сериализатора, который выглядит следующим образом:

"results": [
            {
                "property_name": "Villa",
                "username": "Ivan",
                "email": "ivan@mail.com",
                "start_date": "2022-01-05",
                "end_date": "2022-01-19"
            },
            {
                "property_name": "Villa",
                "username": "Ivan",
                "email": "ivan@mail.com",
                "start_date": "2022-02-16",
                "end_date": "2022-03-03"
            },
            {
                "property_name": "Villa",
                "username": "Ivan",
                "email": "ivan@mail.com",
                "start_date": "2022-02-11",
                "end_date": "2022-02-25"
            }
        ]

Интересно, возможно ли, чтобы ответ сериализатора выглядел следующим образом:

[
  {
    name: 'Ivan',
    email: 'ivan@mail.com',
    stays: [
      {
        "start_date": "2022-01-05",
        "end_date": "2022-01-19",
        "property_name: Villa"
      },
      {
        "start_date": "2022-02-16",
        "end_date": "2022-03-03",
        "property_name: Villa"
      },
      {
        "start_date": "2022-02-11",
        "end_date": "2022-02-25",
        "property_name: Villa"
      },
    ]
  }  
]

Это моя модель:

class PropertyReservation(BaseModelFields):
    start_date = models.DateField()
    end_date = models.DateField()
    property = models.ForeignKey('property.Property', on_delete=models.CASCADE)
    user = models.ForeignKey('user.UserModel', on_delete=models.CASCADE)

мой сериализатор:

class PropertyReservationGuestSerializer(serializers.ModelSerializer):
    property_name = serializers.ReadOnlyField(source='property.name')
    username = serializers.ReadOnlyField(source='user.username')
    email = serializers.ReadOnlyField(source='user.email')

    class Meta:
        model = PropertyReservation
        fields = ('property_name', 'username',
                  'email', 'start_date', 'end_date')

Я попробовал несколько вещей и не могу добиться того, чтобы ответ сериализатора выглядел как в примере выше. Это был лучший ответ, который я нашел в интернете Django RestFramework group by и все равно не смог этого сделать, на первом решении я получил ошибку при вызове функции super(): "super(type, obj): obj must be an instance or subtype of type". Во втором решении, когда я пытаюсь достичь желаемого с помощью SerializerMethodField, я получаю ошибку "object has no attribute 'filter'".

Есть ли у вас какие-либо предложения о том, как я могу это сделать? Спасибо за любую помощь.

Есть один способ получить остатки с помощью SerializerMethodField

class PropertyReservationSerializer(BaseModelFields):
    start_date = models.DateField()
    end_date = models.DateField()
    property = models.ForeignKey('property.Property', on_delete=models.CASCADE)
    user = models.ForeignKey('user.UserModel', on_delete=models.CASCADE)

class PropertyReservationGuestSerializer(serializers.ModelSerializer):
    username = serializers.ReadOnlyField(source='user.username')
    email = serializers.ReadOnlyField(source='user.email')
    stays = serializers.SerializerMethodField()

    def get_stays(self, obj):
        stays = obj.user.propertyreservation_set.all() # get this user's stay
        return PropertyReservationGuestSerializer(stays, many=True)

    class Meta:
        model = PropertyReservation
        fields = ('username', 'email', 'stays')
Вернуться на верх