0

私はジャンゴモデルを持っています:

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 を使用しているのに、オブジェクトが存在しないと表示されるのはなぜですか? .get() ではなく .all() を使用してインスタンスを取得できるのはなぜですか?

上記のコードは、テスト環境 (TestCase) のクラスベース ビューで実行されていることに注意してください。ターミナルで同じことを試してみると、うまくいきます。

4

2 に答える 2

2

フロートを主キーとして使うのは悪い考えです。

float 表現がすべてのレベルでまったく同じであることを保証することはできません。Python float の実装はインタープリター固有であり、DB の double とは精度が異なる可能性があります。

于 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 に答える