Tengo modelos Product y ProductCategory .
Digamos que tengo ProductCategory TV , que tiene Sony , Samsung como sus productos. También tengo la categoría MobilePhone con Apple y Nokia como sus productos. Usando DRF, me gustaría obtener una salida JSON usando serializadores, que es similar a la siguiente:
{ 'TV': [ 'Sony': { 'price': '$100', 'country': 'Japan', }, 'Samsung': { 'price': '$110', 'country': 'Korea', } ] 'mobile_phone': [ 'Apple': { 'price': '$300', 'country': 'USA', }, 'Nokia': { 'price': '$210', 'country': 'Finland', } ] } El problema aquí es que los nombres de los campos ('TV', 'mobile_phone') en el serializador tienen que ser dinámicos.
Sé que puedo obtener el siguiente tipo JSON
{ [ { 'product_category': 'TV', 'manufacturer: 'Sony', 'price': '$100', 'country': 'Japan', }, { 'product_category': 'TV', 'manufacturer: 'Samgsung', 'price': '$110', 'country': 'Korea', } ] [ { 'product_category': 'mobile_phone', 'manufacturer: 'Samgsung', 'price': '$300', 'country': 'USA', }, { 'product_category': 'mobile_phone', 'manufacturer: 'Apple', 'price': '$210', 'country': 'Finland', } ] }con
class CategorySerializer(serializers.Serializer): product_category = serializer.CharField() manufacturer = serializer.CharField() price = serializer.CharField() country = serializer.CharField()Pero los nombres de campo que cambian dinámicamente son difíciles de lograr. ¿Hay alguna manera de que pueda hacer esto?
Puede admitir este tipo de formato personalizado anulando to_representation de su serializador y del ListSerializer predeterminado :
Primero, anula to_representation de su serializador:
class CategorySerializer(serializers.Serializer): # your fields here def to_representation(self, obj): return { obj.manufacturer: { 'price': obj.price, 'country': obj.country } }Para que sus categorías serializadas sean de esta forma:
{ 'Sony': { 'price': '$100', 'country': 'Japan' } } Luego, para anteponer product_category delante de su lista, puede usar un ListSerializer personalizado con una to_representation personalizada:
class CategoryListSerializer(serializers.ListSerializer): def to_representation(self, data): # Group your data entries by category here ... return { 'TV': tv_data 'mobile_phone': mobile_data } class CategorySerializer(serializers.Serializer): ... class Meta: list_serializer_class = CategoryListSerializer