如何显示外键值而不是 id?
How to display a foreign key value instead of the id?
我有以下型号:
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"
序列化程序如下:
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']
这里tail_number,flight_number是外键。当我创建一个 API 时,我得到的响应是字段的 ID。如何在 json?
中显示名称
我的views.py如下:
@api_view(['GET'])
def flight_schedule(request):
schedule = FlightSchedule.objects.all()
serializer = FlightScheduleSerializer(schedule, many=True)
return Response(serializer.data)
您可以在序列化程序中使用 field_name 定义源,如下所示。
我用过source='TailNumber.number'
。请用右边的field_name代替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']
您可以像添加属性一样简单地添加它们。
flight_number_str = serializers.ReadOnlyField(source='flight_number.flight_number')
首先flight_number
是FlightScheduleDetail
的属性,然后是FlightSchedule
的属性
然后将其添加到字段列表fields = [..., 'flight_number_str']
否则你可以看看nested relationships in DRF,它也可以提供更多的可能性。
另一种方法是在序列化程序中使用 depth
选项。就是指定嵌套序列化 - doc
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('id', 'account_name', 'users', 'created')
depth = 1
如果用户是外键或多对多键,序列化程序会将用户显示为对象而不是键。
The depth
option should be set to an integer value that indicates
the depth of relationships that should be traversed before reverting
to a flat representation.
我有以下型号:
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"
序列化程序如下:
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']
这里tail_number,flight_number是外键。当我创建一个 API 时,我得到的响应是字段的 ID。如何在 json?
中显示名称我的views.py如下:
@api_view(['GET'])
def flight_schedule(request):
schedule = FlightSchedule.objects.all()
serializer = FlightScheduleSerializer(schedule, many=True)
return Response(serializer.data)
您可以在序列化程序中使用 field_name 定义源,如下所示。
我用过source='TailNumber.number'
。请用右边的field_name代替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']
您可以像添加属性一样简单地添加它们。
flight_number_str = serializers.ReadOnlyField(source='flight_number.flight_number')
首先flight_number
是FlightScheduleDetail
的属性,然后是FlightSchedule
然后将其添加到字段列表fields = [..., 'flight_number_str']
否则你可以看看nested relationships in DRF,它也可以提供更多的可能性。
另一种方法是在序列化程序中使用 depth
选项。就是指定嵌套序列化 - doc
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('id', 'account_name', 'users', 'created')
depth = 1
如果用户是外键或多对多键,序列化程序会将用户显示为对象而不是键。
The
depth
option should be set to an integer value that indicates the depth of relationships that should be traversed before reverting to a flat representation.