0

おそらく、存在しないクエリ セットを処理するより良い方法があります...! このコードの問題点は、通常のケースが true の場合に例外が発生することです。つまり、データベース内に同じ名前のワークスペース名が存在しない場合です。

しかし、例外を発生させる代わりに、DoesNotExist を返さずに true または false を返すクエリを実行したいと考えています。

私の洗練されていないコード:

 try:
            is_workspace_name = Workspace.objects.get(workspace_name=workspace_name,user=self.user.id )
 except:
        return workspace_name
 if is_workspace_name:
            raise forms.ValidationError(u'%s already exists as a workspace name! Please choose a different one!' %workspace_name  ) 

どうもありがとう!

4

3 に答える 3

3

exists()メソッドを使用できます。ドキュメントの引用:

QuerySet に結果が含まれている場合は True を返し、含まれていない場合は False を返します。これは、可能な限り簡単で高速な方法でクエリを実行しようとしますが、通常の QuerySet クエリとほぼ同じクエリを実行します。

備考: 最も簡単で最速の方法です。データベースは最初の出現でカウントを停止するため、 exists( よりもcount)使用する方が安価です。exists

if Workspace.objects.filter(workspace_name=workspace_name, 
                            user=self.user.id).exists()
    raise forms.ValidationError(u'%s already exists ...!' % workspace_name)
else:
    return workspace_name
于 2012-10-06T21:14:12.593 に答える
1

レコードの存在を確認しています。

データベース内のレコードの存在をテストする場合は、Workspace.objects.filter(workspace_name = workspace_name,user = self.user.id).count().

これにより、条件に一致するレコードの数が返されます。何もない場合、この数は 0 になり、if句ですぐに使用できます。これが、ここで必要なことを行うための最も標準的で簡単な方法だと思います。

## 編集 ## 実際にはそうではありませんQueryset.exists

警告: 挿入前に存在をチェックする場合

ただし、レコードを挿入する前に重複があるかどうかを確認する予定がある場合は特に、このような構成を使用する場合は注意してください。このような場合の最善の解決策は、レコードを作成して、例外が発生するかどうかを確認することです。

実際、次のような状況になる可能性があります。

  1. リクエスト1がサーバーに到達
  2. リクエスト 2 がサーバーに到達する
  3. リクエスト 1 のチェックが行われ、オブジェクトが存在しません。
  4. リクエスト 2 のチェックが行われ、オブジェクトが存在しません。
  5. リクエスト 1 の作成に進みます。
  6. リクエスト 2 の作成に進みます。

そして...重複があります-これは競合状態と呼ばれ、並列コードを処理する際の一般的な問題です。

簡単に言えば、挿入を扱うときはtryexpectおよび制約を使用する必要があります。unique

init3get_or_createで提案されているように、を使用することも役立ちます。確かに、get_or_createこれを認識しており、不要な重複が発生する限り安全です。IntegrityError

于 2012-10-06T21:09:46.423 に答える
0
obj, created = Workspace.objects.get_or_create(workspace_name=workspace_name, user=self.user.id)

if created:
    # everything ok
    # do something
    pass
else:
    # not ok
    # respond he should choose anything else
    pass

ドキュメントで詳細を読む

于 2012-10-06T21:04:13.667 に答える