2012-08-06 47 views
1

我想在Django中創建一個簡單的基於地理位置的應用程序。我想保留用戶的位置作爲他登錄的最後一個緯度/長度。爲此,我創建了一個位置類。要存儲額外的用戶數據,我有一個UserProfile類。我想保留位置UserProfile以及。決定在Django中使用@staticmethod,@property或manager

有三種實現方法,我可以想到 - 使用@staticmethod,@property或經理。然後定義一個__unicode__方法,該方法將返回帶有最近日期的緯度/經度的列表。這將是最好的方法呢?以下是我的模型:

class Location(models.Model): 
    user = models.ForeignKey(User) 
    latitude = models.CharField(max_length=10) 
    longitude = models.CharField(max_length=10) 
    date = models.DateTimeField(auto_now_add = True) 


class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    location = the_last_login_location 
    rating = models.IntegerField() 

回答

2

我會使用一個屬性:

class Location(models.Model): 
    user = models.ForeignKey(User, related_name="locations") 
    latitude = models.CharField(max_length=10) 
    longitude = models.CharField(max_length=10) 
    date = models.DateTimeField(auto_now_add = True) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    rating = models.IntegerField() 

    @property 
    def last_location(self): 
     return self.locations.latest("date") 
     # Alternatively: return self.objects.all().order_by("-date")[0] 

注意related_name我已經加入到user字段中Location模型 - 它使反向查找一少許清潔劑和更容易閱讀

編輯:我改變了查詢中使用latest()

+0

可以請你解釋一下,爲什麼你不會使用@staticmethod或manager? – user993563 2012-08-06 19:19:28

+1

管理器(這是Django的一個功能,不是python)通常意味着對整個表進行操作,而不是對單個行進行操作,而模型的方法或屬性則在該特定行上進行操作。當您正在尋找特定用戶的最後位置,而不是所有用戶最近位置(或類似的)的列表時,這裏的屬性是有意義的。 – 2012-08-06 19:28:11

+0

靜態方法(這是Python和一般編程的一個特性)不能在類的實例上調用(儘管它們可以接受類的實例),因此不能訪問「self」等。它們是用於執行與該類相關的通用操作,但不一定與該實例相關。你會在[Wikipedia](http://en.wikipedia.org/wiki/Static_method#Static_methods)或[SO]上得到更好的定義(http://stackoverflow.com/questions/735975/static-methods-在-蟒蛇) – 2012-08-06 19:34:57