如何返回第一个序列化对象而不是Django中的所有对象?
我有一个API(使用django rest框架)和两个模型(例如用户和汽车) 我试图在查询用户时也返回用户的最新(最高ID)汽车 我尝试在用户序列化程序中包含如何返回第一个序列化对象而不是Django中的所有对象?,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我有一个API(使用django rest框架)和两个模型(例如用户和汽车) 我试图在查询用户时也返回用户的最新(最高ID)汽车 我尝试在用户序列化程序中包含cars=CarSerializer(many=True),该程序返回该用户的所有汽车 我尝试了cars=CarSerializer(many=False),它返回我想要的格式,但没有出现cars 代码 汽车模型 等级车(型号.型号): name=models.TextField(默认值=“”) 年份=型号。整型字段(空=真) owner=
cars=CarSerializer(many=True)
,该程序返回该用户的所有汽车
我尝试了cars=CarSerializer(many=False)
,它返回我想要的格式,但没有出现cars
代码
汽车模型
等级车(型号.型号):
name=models.TextField(默认值=“”)
年份=型号。整型字段(空=真)
owner=车型。ForeignKey('User',related_name='cars')
汽车连载器
类序列化程序(serializers.ModelSerializer):
类元:
型号=汽车
字段=('id','name','year','owner')
用户序列化程序
class UserSerializer(serializers.ModelSerializer):
car=CarSerializer(many=True)
类元:
模型=用户
字段=('id'、'first\u name'、'last\u name'、'car')
汽车视野
class CarViewSet(ViewSet.ReadOnlyModelViewSet):
queryset=Car.objects.all()
serializer\u class=CarSerializer
用户视图
class UserViewSet(ViewSet.ReadOnlyModelViewSet):
queryset=User.objects.all()
serializer\u class=UserSerializer
我在找什么
给定两辆属于用户且ID为1的汽车:
id:1
业主:1
名字:“挺不错的车”
年份:2012年
身份证号码:2
业主:1
名称:“最快的”
年份:2020年
GET/users/1的JSON结果
我现在得到的
GET/users/1的JSON结果
谢谢,我希望您能帮助我找到解决方案。必须将
CarSerializer
与queryset或对象链接,否则它将返回所有对象
# get the car object with the highest using order_by
car = Car.objects.all().order_by('-id')[0]
# build a car serializer from the car object
car_serializer = CarSerializer(car, many=False)
CarSerializer
必须与queryset或对象链接,否则它将返回所有对象
# get the car object with the highest using order_by
car = Car.objects.all().order_by('-id')[0]
# build a car serializer from the car object
car_serializer = CarSerializer(car, many=False)
您可以编写像bellow这样的用户序列化程序
class UserSerializer(serializers.ModelSerializer):
cars = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('id', 'first_name', 'last_name', 'cars')
def get_cars(self, instance):
cars = instance.cars.all().order_by('-year')
return CarSerializer([cars[0], ], many=True).data
调用GET/users/1
将返回如下结果
{
"id": 2,
"first_name": "Bob",
"last_name": "McFastCar",
"cars": [
{
"id": 2,
"name": "the fastest one",
"year": 2020,
"owner": 2,
"first_name": "Bob"
}
]
}
下面的行给了我一个未知错误,所以我用many=True编写了它
return CarSerializer(cars, many=False).data
您可以编写像bellow这样的用户序列化程序
class UserSerializer(serializers.ModelSerializer):
cars = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('id', 'first_name', 'last_name', 'cars')
def get_cars(self, instance):
cars = instance.cars.all().order_by('-year')
return CarSerializer([cars[0], ], many=True).data
调用GET/users/1
将返回如下结果
{
"id": 2,
"first_name": "Bob",
"last_name": "McFastCar",
"cars": [
{
"id": 2,
"name": "the fastest one",
"year": 2020,
"owner": 2,
"first_name": "Bob"
}
]
}
下面的行给了我一个未知错误,所以我用many=True编写了它
return CarSerializer(cars, many=False).data
实际上,您可以在
用户
模型中创建只返回最后一辆车的@属性
:
类用户:
...
@财产
def最后一辆车(自我):
返回self.cars.last()
然后在UserSerializer
中,您可以序列化此属性:
类用户序列化程序:
last_car=CarSerializer(只读=True)
类元:
模型=用户
字段=(…,“最后一辆车”)
这样就行了
注意:如果您仍然希望将最新的汽车条目序列化为
“car”:{…}
,而不是“last_car”:{…}
,您可以在汽车序列化程序
本身上使用:
class UserSerializer:
car = CarSerializer(source='last_car', read_only=True)
...
实际上,您可以在
用户
模型中创建只返回最后一辆车的@属性
:
类用户:
...
@财产
def最后一辆车(自我):
返回self.cars.last()
然后在UserSerializer
中,您可以序列化此属性:
类用户序列化程序:
last_car=CarSerializer(只读=True)
类元:
模型=用户
字段=(…,“最后一辆车”)
这样就行了
注意:如果您仍然希望将最新的汽车条目序列化为
“car”:{…}
,而不是“last_car”:{…}
,您可以在汽车序列化程序
本身上使用:
class UserSerializer:
car = CarSerializer(source='last_car', read_only=True)
...
谢谢你的回答。我明白你的意思,但不幸的是我还没有找到解决办法。汽车查询集在视图集中链接,我编辑了我的问题以反映这一点。我认为,即使它确实有效,以这种方式轮询对象也会失去“所有者”关系
car\u序列化程序。data
将返回car对象的json表示。感谢您的回答。我明白你的意思,但不幸的是我还没有找到解决办法。汽车查询集在视图集中链接,我编辑了我的问题以反映这一点。我认为,即使它确实有效,以这种方式轮询对象也会失去“所有者”关系car\u序列化程序。data
将返回car对象的json表示。