我不知道这是否是解决问题的最佳方法,如果不是,请告诉我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)。
我可以这样做(或部分)只使用模型吗?
答案 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的内容。我只是好奇,如果这是一种可能性