在Django中过滤单个对象的反向关系

时间:2016-01-25 21:50:21

标签: python django api rest django-rest-framework

假设我有以下两种模式:

class Person(models.Model):
    """
    A person model with the name of the person.
    """
    name = models.CharField()


class Vehicle(models.Model):
    """
    A vehicle model with the owner of the vehicle, and the type of the vehicle.
    A vehicle type could be a car, a truck or a bike.
    """
    owner = Models.ForeignKey(Person, related_name='vehicles')
    type = models.CharField()

使用这两个模型,Django将自动创建一个向后关系,通过以下查询可以访问一个人的所有车辆:

    person = Person.objects.get(pk=1)
    person.vehicles.all()

这将返回与该人相关的所有车辆,到目前为止一切顺利。

现在假设我想要过滤车辆的人物对象,说我只想要自行车类型的车辆。我怎么能这样做?

要将问题放在上下文中,我正在尝试构建以下网址:

    api.example.com/v1/person/1/vehicles/ [returns all vehicles]
    api.example.com/v1/person/1/vehicles/?type=bike [returns only vehicles of type bike]

谢谢。

1 个答案:

答案 0 :(得分:4)

person.vehicles.filter(type='Bike')

顺便说一下,使用type作为字段名称并不好,因为它是一个python保留关键字。请尝试改为vehicle_type

修改

如果你想要人物对象,请执行:

Person.objects.filter(vehicles__type="Bike")

检查django doc chaining filters

<强>重新编辑:

要获得一个人拥有的自行车,你可以:

person = Person.objects.get(pk=1)
all_bikes = person.vehicles.filter(type="Bike")