Django - 在“选择”中添加在线列

时间:2009-11-27 15:13:32

标签: django

我不知道这是否是解决问题的最佳方法,如果不是,请告诉我PLZ:)

我有这个型号:


class userTrophy(models.Model):
 user     = models.ForeignKey(userInfo)
 platinum = models.IntegerField()
 gold    = models.IntegerField()
 silver  = models.IntegerField()
 bronze  = models.IntegerField()
 level   = models.IntegerField()
 perc_level  = models.IntegerField()
 date_update = models.DateField(default=datetime.now, blank=True)

现在我想要检索一个用户信息,但我想在线添加3个新“列”:

总计=铂金+金+银+铜

点=铂* 100 +金* 50 +银* 25 +青铜* 10

并按“点”排序,排序后,添加一个新列,序列号为:rank(1-n)。

我可以这样做(或部分)只使用模型吗?

3 个答案:

答案 0 :(得分:3)

我确信有很多方法可以实现这种行为。我现在想到的是Custom Model Manager和瞬态模型字段。

你的班级可能如此:

from django.db import models
from datetime import datetime

class UserTrophyManager(models.Manager):
  def get_query_set(self):
    query_set = super(UserTrophyManager, self).get_query_set()

    for ut in query_set:
      ut.total = ut.platinum + ut.gold + ut.silver + ut.bronze
      ut.points = ut.platinum * 100 + ut.gold * 50 + ut.silver * 25 + ut.bronze * 10

    return query_set

class UserTrophy(models.Model):
  user         = models.CharField(max_length=30)
  platinum     = models.IntegerField()
  gold         = models.IntegerField()
  silver       = models.IntegerField()
  bronze       = models.IntegerField()
  level        = models.IntegerField()
  perc_level   = models.IntegerField()
  date_update  = models.DateField(default=datetime.now, blank=True)

  total        = 0
  point        = 0

  objects      = UserTrophyManager()

  class Meta:
    ordering = ['points']

因此,您可以使用以下内容并获得总计和点数:

user_trophies = userTrophy.objects.all()

for user_trophy in user_trophies:
    print user_trophy.total

答案 1 :(得分:3)

这是我的方式。将列'total'和'points'添加到模型中,如下所示:

class UserTrophy(models.Model):
    ...
    total = models.IntegerField()
    points = models.IntegerField()
    ...

覆盖模型的保存方法:

def save(self, *args, **kwargs):
    # Compute the total and points before saving
    self.total = self.platinum + self.gold + self.silver + self.bronze
    self.points = self.platinum * 100 + self.gold * 50 + \
        self.silver * 25 + self.bronze * 10

    # Now save the object by calling the super class
    super(UserTrophy, self).save(*args, **kwargs)

在模型上将total和points作为一等公民,你的“rank”概念只是对UserTrophy对象进行排序和切片的问题。

top_ten = UserTrophy.objects.order_by('-points')[:10]

您还需要确保将字段编入索引,以便查询有效。

如果您不喜欢将这些字段放在模型中,可以使用Django查询集对象的extra功能来动态计算总数和点数。我不经常使用它,所以也许其他人可以把一个例子放在一起。

此外,我建议您阅读PEP 8以了解Python编码约定。

答案 2 :(得分:1)

这更像是一个后续问题,而不是一个答案,但是可以做类似的事情:

class userTrophy(models.Model):
... stuff...

    def points(self):
        self.gold + self.silver + self.bronze

然后在模板中调用类似object.points的内容。我只是好奇,如果这是一种可能性