0

我有一个 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)中的基于类的视图中运行的。当我在终端中尝试同样的事情时,它工作正常。

4

2 回答 2

2

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

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

于 2013-01-29T05:23:05.603 回答
1

Django 将自动填充主键(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:
    ...
于 2013-01-28T22:25:52.160 回答