根据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()