이 모델을 다른 모델에 추가하기 전에이 모델을 저장 해야하는 이유는 무엇입니까?
문제
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 문서 잘 이해하기 위해.