django - how - Agregar campos personalizados en un serializador basado en criterios de instancia
django rest framework serializer (1)
Lo que quieres son serializadores .
Puede anular el resultado predeterminado devuelto por la función to_representation()
del serializador. Y agregue los campos min_date
y max_date
al resultado producido.
Como
class FoodSerializer(serialiers.ModelSerializer):
def to_representation(self, instance):
result = super(FoodSerializer, self).to_representation(instance)
result[''min_date''] = min[each.date for each in instance.m2mfield.all()]
result[''max_date''] = max[each.date for each in instance.m2mfield.all()]
return result
Django 1.10
una aplicación Django 1.10
con Rest-Framework
, tengo problemas para crear cualquier campo personalizado que M2MField
el rango de fechas de un campo de fecha en M2MField
, explicaré mi problema con mi código.
class FoodConsumption(models.Model):
''''''
An item consume by animal.
''''''
animal = models.ForeignKey(
Animal, related_name=''animal_food_consumptions'', on_delete=models.CASCADE)
food = models.ForeignKey(
Food, related_name=''food_consumptions'', on_delete=models.CASCADE)
date = models.DateField()
class FoodConsumptionTransaction(models.Model):
herd = models.ForeignKey(
Herd, related_name="food_consumption_transactions",
on_delete=models.CASCADE
)
food_consumptions = models.ManyToManyField(FoodConsumption)
Y aquí está mi serializador para mostrar los datos de FoodConsumptionTransaction
.
class FoodConsumptionTransactionListSerializer(serializers.ModelSerializer):
class Meta:
model = FoodConsumptionTransaction
fields = [''id'', ''herd'', ''food_consumptions'']
Crea un par de FoodConsumption
:
from dateutil import parser
fc1 = FoodConsumption.objects.create(
animal=animal_obj_1,
food=food_obj_1,
date=parser.parse(''2017-04-06'').date() // min date
)
fc2 = FoodConsumption.objects.create(
animal=animal_obj_2,
food=food_obj_2,
date=parser.parse(''2017-04-08'').date()
)
fc3 = FoodConsumption.objects.create(
animal=animal_obj_3,
food=food_obj_2,
date=parser.parse(''2017-04-10'').date() // max date
)
# add to the transaction
fc_trans = FoodConsumptionTransaction.objects.create(
herd=herd_obj_1
)
fc_trans .food_consumptions.add(fc1, fc2, fc3)
Ahora cuando FoodTransaction
datos de FoodTransaction
por manada, obtengo esta lista:
[
{
"id": 1,
"herd": 1,
"food_consumptions": [1, 2, 3], # pks of FoodComsumption
}
]
Pero, ¿cómo puedo crear campos adicionales basados en los campos de food_consumptions
de food_consumptions
, food.date
(min y max) ?
[
{
"id": 1,
"herd": 1,
"food_consumptions": [1, 2, 3], # pks of FoodComsumption
"min_date": ''2017-04-6'', # get the min date of food
"max_date": ''2017-04-10'', # get the max date of food
}
]