首页 > 解决方案 > Django Rest Framework - 如何从相关模型集中仅获取一个字段

问题描述

我有以下型号:

from django.db import models

class City(models.Model):
    name = models.CharField(max_length=30)
    last_update = models.DateTimeField(null=True)

class BusStop(models.Model):
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, blank=True, default='')

现在使用 Django Rest Framework,我想创建序列化程序,它将返回城市详细信息以及城市中所有 BusStops 的列表 - 但我希望该列表只是带有 BusStop 名称的字符串,如下所示:

{
  "id": 1
  "name": "City"
  "last_update": "2019-09-19T22:13:54.851363Z"
  "bus_stops": [
    "stop1",
    "stop2",
    "stop3"
  ]
}

到目前为止,我尝试过的是以下序列化程序:

from rest_framework import serializers

class BusStopSerializer(serializers.ModelSerializer):
    class Meta:
        model = BusStop
        fields = ('name', )


class CityDetailsSerializer(serializers.ModelSerializer):
    busstop_set = BusStopSerializer(many=True)

    class Meta:
        model = City
        fields = ('id', 'name', 'last_update', 'busstop_set')

但这会创建其中包含“名称”的对象列表。那么,如何创建一个仅包含BusStop名称(作为字符串)的列表?

标签: djangodjango-rest-framework

解决方案


而不是额外的,BusStopSerializer你可以使用StringRelatedField

# models.py
class BusStop(models.Model):
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, blank=True, default='')

    def __str__(self):
        return self.name

# serializers.py
class CityDetailsSerializer(serializers.ModelSerializer):
    bus_stops = StringRelatedField(many=True)

    class Meta:
        model = City
        fields = ('id', 'name', 'last_update', 'bus_stops')

推荐阅读