如何返回第一个序列化对象而不是Django中的所有对象?

如何返回第一个序列化对象而不是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=

我有一个API(使用django rest框架)和两个模型(例如用户和汽车)

我试图在查询用户时也返回用户的最新(最高ID)汽车

我尝试在用户序列化程序中包含
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表示。