2016-12-07 44 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

相關問題