决定在Django中使用@staticmethod,@ property或manager

时间:2012-08-06 18:58:22

标签: django django-models

我想在Django中创建一个简单的基于地理位置的应用程序。我想将用户的位置保持为他登录的最后一个纬度/长度。为此,我创建了一个位置类。要存储其他用户数据,我有一个 UserProfile 类。我还想在 UserProfile 中保留位置列。

我可以想到实现它的三种方法 - 使用@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()

1 个答案:

答案 0 :(得分: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()