내 문제는 내 앱에서 OneToOneField
필드를 업데이트 할 수 없다는 것입니다. 여기에 내가하려고하는 것에 대한 나의 설명이있다.Django의 1 대 1 데이터베이스 관계에 적합한 모델 필드
나는 학생에게 빌려준 악기를 추적하는 인벤토리 앱을 만들고 있습니다. 학생과 악기 사이에는 항상 일대일 데이터베이스 관계가 있습니다. 따라서 개별 학생은 둘 이상의 악기를 가질 수 없으며 반대의 경우도 마찬가지입니다.
는 그러므로 나는이처럼 보이는 Intrument 모델 생성 :
class Instrument(models.Model):
instrument_type = models.CharField(max_length=100)
needs_repairs = models.BooleanField()
inventory_id = models.CharField(max_length=100)
student = models.OneToOneField(Student, null=True, blank=True, default = None)
나는 내가 학생들을 기존 업데이트 할 수 있습니다 양식을 만들었을, 나는 가능한 한 많은 내장 재료를 사용하려고 해요 그래서 나는 검증 코드 나 HTML을 재 작성할 필요가 없다. 그래서 ModelForm
개체를 사용하고 is_valid()
메서드를 사용하여 입력 내용의 유효성을 검사하고 있습니다.
csrfmiddlewaretoken=xyUBhVuQZus6XmeV2DhCmpJHwIXVmdHm&instrument_type=Viola&inventory_id=abcde&student=3
는 고유성 제약 조건을 가진 유일한 필드 student
이므로주의 해주십시오 :
여기에 악기를 업데이트 할 POST 요청의 예입니다.
마지막으로, 여기에 문제가 있습니다. is_valid()
메서드를 호출하면 항상 학생이 이미 악기에 지정되었다는 오류가 표시되어 실패합니다.
첫 번째 생각은 학생 pkey가 변경되지 않은 경우 오류가없는 사전 유효성 검사 코드를 추가하기 위해 프레임 워크를 사용하는 것이 었습니다. 이것은 확실히 쉬운 것 같다. 그러나 그것은 나에게 조금 해키 인 것처럼 보인다. 필자는 일대일 관계가 다른 모든 Model 필드와 마찬가지로 "효과가있다"고 가정하고 특별한 유효성 검사가 필요하지 않다고 가정했습니다.
는 그러나 나는 OneToOneField
클래스의 API 문서를 읽고는 일대일 데이터베이스 관계를 해결하지 않는 것 - 일대일 OO 관계를 해결하기 위해 보인다. 그래서 잘못된 Model 필드 유형을 모두 함께 사용했을 수 있습니다. 그리고 이것은 단순한 응용 프로그램이므로 많은 데이터 모델링을 수행하지 않습니다. 적절한 데이터 모델링에 대해 걱정하고 있습니다. :
그래서 잘못된 필드를 사용하고 있거나 "적절한" 내 학생 모델에 사전 유효성 확인 코드를 추가하기 위해이 문제를 해결할 방법이 있습니까?
>>> data = {'instrument_type': 'Viola', 'inventory_id': 'abcde', 'student': 3, 'repairer': 1}
>>> form = InstrumentForm(data)
>>> form.is_bound
True
>>> form.is_valid()
False
>>> form.errors
{'student': [u'Instrument with this Student already exists.']}
내가 악기의 세부 사항을 표시하고 하나의 악기를 업데이트 할 단일보기 방법을 사용 : 댓글
에서
업데이트는 여기에 내가 스택 추적에있는 가장 가까운 일이다. 그 점은 다음과 같습니다.
def instrument_detail(request, instrument_id):
try:
instrument = Instrument.objects.get(pk=instrument_id)
except Instrument.DoesNotExist:
raise Http404
# Default if not a POST
form = InstrumentForm(instance=instrument)
if request.method == 'POST':
form = InstrumentForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('instruments.views.instruments_index'))
# otherwise...
t = loader.get_template('instruments/details.html')
c = RequestContext(request, {
'instrument': instrument,
'form': form,
})
return HttpResponse(t.render(c))
오류 스택 추적을 포함 할 수 있습니까 ??? – cdvv7788
* 잘못된 필드를 사용하고 있습니까? * 아니요. O2O는 실제로 데이터베이스 수준의 관계입니다 (고유 제한이있는 외래 키). *이 코드를 수정하여 사전 검증 코드를 내 Student 모델에 추가하는 "적절한"방법입니까? * 아니요. 어딘가에 코드에 버그가 있다고 생각합니다.도움이 필요하면 스택 추적과 양식을 처리하는보기 코드를 게시해야합니다. –