>

get_or_create 를 사용하려고합니다  레코드가 있는지 확인하는 방법. 레코드가 존재하면 아무 것도 만들지 마십시오.

이 모델은 기본적으로 실패한 명령에 사용됩니다

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!

이제 문제가 있습니다. 관리자를 통해 데이터베이스를 살펴보면 두 개의 개체가 있지만 두 개체 모두 normalBodyPart 와 관련된 값을 갖습니다.  그리고 그들의 abnormalBodyPart  명시 적으로 지정하고 abnormalBodyPart 에 값을 할당했기 때문에  django는 왜 두 항목이 이미 존재한다고 말합니까? 나는 이것이 의미가 있기를 바랍니다.

이 방법을 다른 방법으로 설명하고 1과 2의 두 문장이 있다고 가정하자. 명령문 1은 지정된 매개 변수를 기반으로 레코드를 가져 오거나 작성합니다. django가 이미 두 개의 레코드가 있다고 생각 하므로이 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 에 대한 값을 가지고 있지 않은 경우 . 다음을 수행하여이를 확인했습니다

문구 2 :

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

위의 문장 2는 아무것도 반환하지 않습니다. 내 질문은 왜 진술 2가 아무것도 반환하지 않는 동안 진술 1은 이미 2 가지 항목이 있다고 주장하면서 get 가 실패한다고 불평하는 것입니다.  전화.

  • 답변 # 1

    당신은 get_or_create() 를 호출  인수없이 __call__() 를 호출하십시오.  결과 인스턴스의 메소드.

    get_or_create 안에 키워드를 넣습니다  제대로 작동하도록 또한 메소드 서명을 다시 연구하십시오. defaults 가 누락되었습니다.  논의. 이 방법은 다음과 같이 작동합니다.

    "defaults"를 제외하고 제공된 키워드 인수를 필터링

    아무것도 반환되지 않으면 해당 키워드 인수로 새 인스턴스를 만들고 "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
    
    

관련 자료

  • 이전 lotus notes - 사용자가 "상태"필드를 기반으로 다른 문서를 선택하지 못하도록 선택 문서를 필터링하는 방법
  • 다음 amazon web services - 탄력적 검색에서 다양한 유형의 샤드