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')