2016-12-07 37 views
0

我在models.py这两个类:基于Django ORM中最后一个孩子获取所有匹配记录?

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的查询,它给了我每个驱动程序的最后位置,想象我从客户端收到latitudelongitude并希望返回所有靠近的汽车。


我尝试这样做:

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))\ 

但问题是,我得到基于自己的立场单个驱动器的几个时间。
现在我只想获得最新的更新位置,而不是他们以前的驱动程序。
谢谢

回答

2

这是一个想法,以获得不同的驱动程序(这就是为什么我明白你想要得到)与它的最后一个位置。

首先,由驾驶员位置排序,从最后一个到第一个。
.order_by('-person__create_date',)

然后使用distinct为了获得每个位置只驱动器(最后一个):
.distinct()


而这里的第二个命题,让每一个司机与它的最后位置(感谢到你的自动'create_date'和Django Annotate):

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>) 

在这里,中的每一项queryset将具有last_position属性。


最后,以@迈赫达德-pedramfar请求,想法得到的驱动器的last_position

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

我还没有尝试过对你的代码,但想法是在这里。每次调用它都会花费数据库调用。 结果是最后Position对象为当前Driver :)

+0

感谢您的回答。但我不想只得到每个位置的驱动程序。我想获得每位车手的最后位置。你可以为此提出任何建议吗?@ppython –

+0

在这里,@ mehrdad-pedramfar – ppython

+0

在这里,@ mehrdad-pedramfar,我添加了带注释的第二个想法!这一个应该更精确地做你需要的东西!让我更新。 – ppython

相关问题