编辑:这些不同的类型只是因为django方法:
request.POST.get("attribute")
来自Json数据,返回unicode。
解决方案是在开始时解析这些值
我有一个大问题,我不明白它来自哪里。
在我的分数模型中,为了保存游戏的分数,我需要在保存之前比较当前分数和旧分数的值。我的错误是我的字段类型不同,而我的对象类型是相同的。
也许有些代码可以解释:
class Score(models.Model):
map = models.ForeignKey(Map, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
score = models.FloatField()
class Meta:
unique_together = ('map', 'user')
def save(self, *args, **kwargs):
try:
oldScore = Score.objects.get(map=self.map, user=self.user)
except ObjectDoesNotExist:
oldScore = None
if oldScore is not None:
if oldScore.score < self.score:
print >> sys.stderr, type(oldScore), type(self)
print >> sys.stderr, type(oldScore.score), type(self.score)
oldScore.delete()
else:
return False
super(Score, self).save(*args, **kwargs)
return True
def __unicode__(self):
return str(self.map) + ' - ' + self.user.username + " : " + str(self.score)
以及如何创建乐谱并保存:
score = Score(map=map, user=user, score=score)
saved = score.save()
调试打印的结果:
<class 'main.models.score.Score'> <class 'main.models.score.Score'>
<type 'float'> <type 'unicode'>
我想比较我的旧分数,但我不能因为这些不同类型。我知道我可以进行一些类型的转换,但我想知道为什么会发生这种情况,也许我在一些愚蠢的事情上失败了:s
ps:我在python 2.7和Django 1.9.2下 谢谢你帮助我:)。
答案 0 :(得分:1)
这是该模型的元类所做的一些魔力。请参阅,模型字段定义为Field
类(或其子类,例如FloatField
)。但是当你想使用模型实例时,你不想在FloatField
属性中有.score
,你想在那里得到实际值,对吧?这是在创建模型实例时由ModelBase.__metaclass__
完成的。
现在,当您保存该值时,它完全没问题,score
的类型是unicode
- 让我们说您通过表单收到了数据,并且所有您收到的数据是unicode
。保存时转换(并验证)该值。 Django看起来是什么样的数据(浮动),并尝试转换该值。如果那不起作用,它将引发异常。否则,将存储转换后的值。
所以你想用你的保存方法做的是:
def save(self, *args, **kwargs):
if self.pk: # the model has non-empty primary key, so it's in the db already
oldScore = Score.objects.get(self.pk)
if oldScore.score > float(self.score):
# old score was higher, dont do anything
return False
super(Score, self).save(*args, **kwargs)
return True