Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Django ORM中的最后一个子项获取所有匹配记录?_Django_Python 3.x_Django Models_Django Orm - Fatal编程技术网

根据Django ORM中的最后一个子项获取所有匹配记录?

根据Django ORM中的最后一个子项获取所有匹配记录?,django,python-3.x,django-models,django-orm,Django,Python 3.x,Django Models,Django Orm,我的模型中有这两个类。py: class BaseObject(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) create_date = models.DateTimeField(auto_now_add=True) update_date = models.DateTimeField(auto_now=True) class

我的
模型中有这两个类。py

class BaseObject(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['create_date']


class Person(BaseObject):

    first_name = models.CharField(max_length=30, null=True, blank=True)
    last_name = models.CharField(max_length=30, null=True, blank=True)
    phone_number = models.CharField(max_length=15,unique=True)
    birthday = models.DateField(null=True, blank=True)
    email = models.EmailField(null=True, blank=True)

class Driver(Person):
    balance = models.PositiveIntegerField(null=True, blank=True)
    score = models.PositiveIntegerField(null=True, blank=True)

class Position(BaseObject):
    person = models.ForeignKey(Driver, on_delete=models.CASCADE)
    latitude = models.FloatField()
    longitude = models.FloatField()
正如你所看到的,通过时间的推移,每个驾驶员可能有几个位置。
我想用Django ORM查询每个司机的最后位置,假设我从客户那里收到一个
纬度
经度
,并希望返回附近的所有车辆


我试过这个:

 radius = 5

 drivers = Driver.objects.filter(position__latitude__range=(data.get('latitude') - radius, data.get('latitude') + radius))\
                         .filter(position__longitude__range=(data.get('longitude') - radius, data.get('longitude') + radius))\
但问题是,根据司机的位置,我多次得到一个司机。
现在我只想让司机知道他们最近的更新位置,而不是他们以前的位置

谢谢你

这里有一个想法,可以让它的最后一个位置有不同的驱动力(这就是为什么我知道你想要得到的)

首先,按驾驶员位置排序,从最后一个到第一个。
.order\u by('-person\u create\u date',)

然后使用以获得每个位置(最后一个位置)的唯一驱动程序:
.distinct()


还有第二个建议,让每个驾驶员都知道自己的最后位置(感谢您的自动“创建日期”和):

我没有试过用你的代码,但想法就在这里。每次调用它都需要一次DB调用。
结果是当前
驱动程序的最后一个
位置
对象
:)

这里有一个想法,可以使用它的最后一个位置获得不同的驱动程序(这就是我理解您试图获得的原因)

首先,按驾驶员位置排序,从最后一个到第一个。
.order\u by('-person\u create\u date',)

然后使用以获得每个位置(最后一个位置)的唯一驱动程序:
.distinct()


还有第二个建议,让每个驾驶员都知道自己的最后位置(感谢您的自动“创建日期”和):

我没有试过用你的代码,但想法就在这里。每次调用它都需要一次DB调用。
结果是当前
驱动程序的最后一个
位置
对象
:)

谢谢您的回答。但我不想每个位置都只有司机。我想知道每个车手的最后位置。你能给我一些建议吗?@ppythonHere、@mehrdad pedramfar、@mehrdad pedramfar,我用注解添加了第二个想法!这一个应该更准确地做你需要的!让我随时更新。亲爱的@ppython,现在唯一重要的是
Max('person\uu create\u date')
。我希望最后一个位置是我的位置表中的一行,而不是dateWell,也许你真的不想将
last\u position
作为数据库的一行,而是作为
position
类:)的一个属性/方法?如果是的话。。。我会在回答中提供第三个想法。谢谢你的回答。但我不想每个位置都只有司机。我想知道每个车手的最后位置。你能给我一些建议吗?@ppythonHere、@mehrdad pedramfar、@mehrdad pedramfar,我用注解添加了第二个想法!这一个应该更准确地做你需要的!让我随时更新。亲爱的@ppython,现在唯一重要的是
Max('person\uu create\u date')
。我希望最后一个位置是我的位置表中的一行,而不是dateWell,也许你真的不想将
last\u position
作为数据库的一行,而是作为
position
类:)的一个属性/方法?如果是的话。。。我将在回答中提供第三个想法。
my_drivers = Driver.objects.all().annotate(last_position=Max('person__create_date'))

my_drivers[0].last_position
datetime.datetime(2016, 11, 17, 14, 25, tzinfo=<UTC>)
class Driver(Person):
    balance = models.PositiveIntegerField(null=True, blank=True)
    score = models.PositiveIntegerField(null=True, blank=True)

    def get_last_position(self):
        return Position.object.filter(person=self).order_by('-create_date').first()