2017-06-27 3 views
0

get_or_createメソッドを使用してレコードが存在するかどうかを調べようとしています。レコードが存在する場合は、何も作成しません。get_or_create 0個のオブジェクトを返すフィルターを使って同じパラメーターをチェックすると、オブジェクトの複数の値が存在するというエラーを返します。

このモデルは、基本的に

class modelStudentExamsPerformed(models.Model): 
     patient = models.ForeignKey(modelPatient) 
     student = models.ForeignKey(modelStudent,on_delete=models.CASCADE) 
     normalBodyPart = models.ForeignKey(modelNormalBodyPartResult,default=None,blank=True,null=True) 
     abnormalBodyPart = models.ForeignKey(modelAbnormalBodyPartResult,default=None,blank=True,null=True) 
     tool = models.CharField(max_length=128, default="") 

を失敗しているコマンドで使用されている今、これは上記の文は私にエラーを与える上記のモデルを使用して

exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None) 

を失敗しているコマンドです。

get() returned more than one modelStudentExamsPerformed -- it returned 2! 

ここで私は問題を抱えています。私は私の管理者を通してデータベースを調べると、2つのオブジェクトに気付いていますが、これらのオブジェクトは両方ともnormalBodyPartの値を持ち、abnormalBodyPartは空です。明示的に指定してabnormalBodyPartに値を割り当てたのはなぜですか?私はこれが理にかなってほしい。

2つのステートメント1と2があるとします。 ステートメント1は、指定されたパラメーターに基づいてレコードを取得または作成します。 djangoは既に2つのレコードがあると考えるので、このgetまたはcreateは失敗します。しかし、文2は同じ正確なパラメータを使用し、0レコードを返します。何故ですか ?私は何が分からず、ここで理解していないのですか?

ステートメント1:

exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None) 

この表のオブジェクトのはっきりどれもabnormalBodyPartの値を持っていません。

k = exams.modelStudentExamsPerformed.objects.filter(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0], normalBodyPart=None,date=None) 

上記なステートメント2は何も返しません:私は、次の

文2を実行して、これを検証しました。私の質問は、ステートメント2が何も返さないのはなぜですか?ステートメント1は既に2つのアイテムがあるので、getコールに失敗していると不平を言います。

+0

は、あなたが本当に.... get_or_create **()(**患者= patient_qsetを持っていますか? **(それは__call __()メソッドの呼び出し、その後、あなたは空の引数を指定してオブジェクトを取得または作成します。それについて考えてみてください。)**緩め。 – Melvyn

+0

うんそれは私がオンラインの例からこれを得た意味があります。私は、彼らがタイプミスがあったと思いますと私はちょうど彼らのタイプミスをコピーしました – MistyD

+0

@メルビンのthトリックはやった。それを答えに入れることができますか? – MistyD

答えて

3

引数なしでget_or_create()を呼び出して、結果のインスタンスに対して__call__()メソッドを呼び出します。

キーワードをget_or_createに入れて正しく動作させるようにします。メソッドシグネチャももう一度調べてください:defaults引数がありません。この方法は、次のように機能します。

  • フィルターを提供するキーワード引数に、「デフォルト」以外
  • 何も返されない場合は、「デフォルト」のキーワード引数を、それらのキーワード引数を使用して新しいインスタンスを作成して使用、であるべきです追加フィールドを埋めるための辞書。

時には、それは説明すると良いでしょう:

instance, created = Players.objects.get_or_create(
    username='Lagolas', 
    defaults={'class': 'ranger', 'gender': 'male'} 
) 

は同等です:

try: 
    instance = Players.objects.get(username='Lagolas') 
    return instance, False 
except Players.DoesNotExist: 
    instance = Players.objects.create(
     username='Lagolas', class='ranger', gender='male' 
    ) 
    return instance, True 
関連する問題