无法使用实例自己的id获取django模型实例

时间:2013-01-28 21:48:50

标签: python django django-models

我有一个django模型:

class ActivationCode(models.Model):
    id = models.FloatField(primary_key=True)
    user = models.ForeignKey('User', to_field='id', on_delete=models.CASCADE)

我很难选择ActivationCode实例,所以我尝试使用自己的id来获取实例:

activation_codes = ActivationCode.objects.all()
print len(tuple(activation_codes))
>>> 1
for code in activation_codes:
    cid = code.id
ActivationCode.objects.get(id=cid)
>>> DoesNotExist: ActivationCode matching query does not exist.

发生了什么事?当我使用自己的id时,为什么说对象不存在?为什么我可以使用.all()而不是.get()来获取实例?

值得注意的是,上述代码在测试环境(TestCase)中基于类的视图中运行。当我在终端尝试相同的东西时,它工作正常。

2 个答案:

答案 0 :(得分:2)

浮动作为主键是一个坏主意。

您无法保证浮动表示在所有级别上完全相同。 Python float实现是特定于解释器的,并且可能与DB双精度的精度不同。

答案 1 :(得分:1)

Django将auto populate主键(id)

class ActivationCode(models.Model):
    #OMIT THIS id = models.FloatField(primary_key=True)
    user = models.ForeignKey('User', to_field='id', on_delete=models.CASCADE)

然后你可以打电话

code = ActivationCode.objects.get(pk=cid)

如果你想要数据库中的项目数(比len更有效)

count = ActivationCode.objects.count()

作为旁注,请在查询集上调用exists()

if qs.exists():
    ....

更有效率
if qs:
    ...