2014-10-22 1 views
0

내 문제는 내 앱에서 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)) 
+0

오류 스택 추적을 포함 할 수 있습니까 ??? – cdvv7788

+2

* 잘못된 필드를 사용하고 있습니까? * 아니요. O2O는 실제로 데이터베이스 수준의 관계입니다 (고유 제한이있는 외래 키). *이 코드를 수정하여 사전 검증 코드를 내 Student 모델에 추가하는 "적절한"방법입니까? * 아니요. 어딘가에 코드에 버그가 있다고 생각합니다.도움이 필요하면 스택 추적과 양식을 처리하는보기 코드를 게시해야합니다. –

답변

0

POST에서 양식을 인스턴스화 할 때 인스턴스를 전달하지 않습니다.

if request.method == 'POST': 
    form = InstrumentForm(request.POST, instance=instrument)