无法通过模型实例的ID获取Django模型实例

0 投票
2 回答
890 浏览
提问于 2025-04-17 13:59

我有一个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 个回答

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:
    ...
2

把浮点数当作主键是个坏主意。

因为你无法保证在不同的环境中,浮点数的表示方式是完全一样的。比如,Python中的浮点数实现可能和你数据库里的双精度浮点数在精度上有所不同。

撰写回答