이 모델을 다른 모델에 추가하기 전에이 모델을 저장 해야하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1806937

  •  05-07-2019
  •  | 
  •  

문제

Django에서는 다음과 같은 일을하려고합니다.

# if form is valid ...
article = form.save(commit=False)
article.author = req.user

product_name = form.cleaned_data['product_name']
try:
    article.product = Component.objects.get(name=product_name)
except:
    article.product = Component(name=product_name)

article.save()
# do some more form processing ...

그러나 그것은 나에게 다음과 같이 말한다.

"product_id"열의 null 값은 null 구속 조건을 위반합니다.

그러나 나는 이것이 왜 문제인지 이해하지 못한다. 언제 article.save() 제품을 만들 수 있어야합니다. 그 다음에 (그리고 ID를 생성).

이 코드를 사용 하여이 문제를 해결할 수 있습니다. except 차단하다:

product = Component(name=product_name)
product.save()
article.product = product

그러나 이것이 나와 관련된 이유는 IF 때문입니다 article.save() 실패하면 이미 새로운 구성 요소/제품을 생성했습니다. 나는 그들이 성공하거나 함께 실패하기를 원합니다.

이것을 돌아 다닐 수있는 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

당신은 다음을 사용하여 이것을 해결할 수 있습니다.

target_product, created_flag = Component.objects.get_or_create(name=product_name)
article.product = target_product

확실히 확신합니다 get_or_create() 객체가 생성 해야하는 경우 객체의 ID를 설정합니다.

또는 기사 테이블에 빈 FK 관계가 마음에 들지 않으면 추가 할 수 있습니다. null=True 정의에.

다른 팁

Django Manytomanyfield가 작동하는 방식은 추가 테이블을 생성한다는 것입니다. 따라서 Modela와 ModelB의 두 가지 모델이 있다고 가정 해 봅시다. 당신이 그렇게했다면 ...

ModelA.model_b = models.ManyToManyField(ModelB)

Django가 실제로 무대 뒤에서하는 일은 테이블을 만드는 것입니다 ... app_modela_modelb 세 가지 열로 : id, model_a_id, model_b_id.

당신의 마음에 그 생각을 붙잡 으십시오. ModelB의 저축과 관련하여 Django는 저장 될 때까지 ID를 할당하지 않습니다. 기술적으로 ID를 수동으로 할당 하고이 문제를 피할 수 있습니다. Django가 완벽하게 수용 가능한 것을 처리하게하는 것 같습니다.

Django는 문제가 있고 M2M을 수행합니다. 왜요? ModelB가 아직 ID가 없다면 model_b_id M2M 테이블의 열? NULL의 오류 product_id ModelB 레코드 ID가 아닌 M2M 필드에서 NULL 제약 조건 오류 일 가능성이 높습니다.

그들이 "함께 성공"하거나 "함께 실패"되기를 원한다면 아마도 거래를 조사 할 때입니다. 예를 들어, 당신은 거래에서 모든 것을 감싸고 부분 실패의 경우 롤백을합니다. 나는이 분야에서 개인적으로 많은 일을하지 않았으므로 다른 사람이 그 주제에 도움이되기를 바랍니다.

트랜잭션에 코드 스 니펫을 포함시키는 데는 가치가 거의 없습니다. Django 문서 잘 이해하기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top