Tengo los siguientes modelos:
class FlightSchedule(models.Model): tail_number = models.ForeignKey(TailNumber, null=False) flight_number = models.CharField(max_length=30, null=False) flight_group_code = models.ForeignKey(FlightGroup, null=False) origin_port_code = models.ForeignKey(Port, null=False, related_name="Origin") destination_port_code = models.ForeignKey(Port, null=False, related_name="Destination") flight_departure_time = models.TimeField() start_date = models.DateField() end_date = models.DateField() def __unicode__(self): return u'%s' % self.flight_number class Meta: verbose_name_plural = "Flight Schedule" class FlightScheduleDetail(models.Model): flight_date = models.CharField(max_length=30, null=False) flight_number = models.ForeignKey(FlightSchedule, null=False, related_name="flight_number_schedule") route_id = models.CharField(max_length=30, null=False, unique=True) flight_status = models.ForeignKey(Status, null=True, default=1) def __unicode__(self): return u'%s' % self.route_id class Meta: verbose_name_plural = "Flight Schedule Details"y el serializador es el siguiente:
class FlightScheduleDetailSerializer(serializers.ModelSerializer): class Meta: model = FlightScheduleDetail fields = '__all__' class FlightScheduleSerializer(serializers.ModelSerializer): flight_number_schedule = FlightScheduleDetailSerializer(many=True) class Meta: model = FlightSchedule fields = ['tail_number', 'flight_number', 'origin_port_code', 'destination_port_code', 'flight_departure_time', 'flight_number_schedule']Aquí tail_number , flight_number es una clave foránea. Cuando creo una API, obtengo la respuesta como la identificación de los campos. ¿Cómo puedo mostrar el nombre en el json?
Mi views.py es el siguiente:
@api_view(['GET']) def flight_schedule(request): schedule = FlightSchedule.objects.all() serializer = FlightScheduleSerializer(schedule, many=True) return Response(serializer.data)Puede definir la fuente con field_name en su serializador de la siguiente manera.
He usado source='TailNumber.number' . Por favor, utilice el nombre de campo correcto en lugar del number
class UserProfileSerializer(serializers.ModelSerializer): tail_number = serializers.CharField(source='TailNumber.number', read_only=True) flight_number = ....(change as above) class Meta: model = FlightSchedule fields = ['tail_number', 'flight_number', 'origin_port_code', 'destination_port_code', 'flight_departure_time', 'flight_number_schedule']Simplemente podría agregarlos como si fueran atributos.
flight_number_str = serializers.ReadOnlyField(source='flight_number.flight_number') Primero flight_number es el atributo de FlightScheduleDetail , luego el de FlightSchedule
y luego agregarlo a la lista de campos fields = [..., 'flight_number_str']
De lo contrario, puede echar un vistazo a las relaciones anidadas en DRF que también pueden ofrecer más posibilidades.
Otra alternativa es utilizar la opción de depth en un serializador. Es para especificar serialización anidada - doc
class AccountSerializer(serializers.ModelSerializer): class Meta: model = Account fields = ('id', 'account_name', 'users', 'created') depth = 1Si los usuarios son una clave externa o una clave de muchos a muchos, el serializador mostrará a los usuarios como un objeto y no como una clave.
La opción de
depthdebe establecerse en un valor entero que indique la profundidad de las relaciones que deben atravesarse antes de volver a una representación plana.