我有一个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)中基于类的视图中运行。当我在终端尝试相同的东西时,它工作正常。
答案 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:
...