2017-09-29 3 views
0

TL : DR : 폼 세트를 사용하여 고유 속성을 가진 여러 객체를 저장/유효성 검증하는 방법은 무엇입니까?Django formset

Machine에는 복수 개의 Setting (아래 모델 참조)이 있습니다. 이 설정은 기계 내에서 고유 한 순서가 있어야합니다. 이것은 Setting 모델의 Meta 클래스의 unique_together 속성을 정의하여 수행 할 수 있습니다

unique_together = (('order', 'machine'),) 

을하지만, 나는 Machine의 모든 Setting의를 업데이트 인라인의 formset을 사용하고 있습니다. 내 formset에 다음 정보가 있다고 가정하십시오.

  • 설정 1 : machine = 1; 주문 = 1
  • 설정 2 : 기기 = 1; 순서 = 2

I 두 Setting들에 순서를 전환하는 경우 :

  • 1 설정 : 기계 = 1; 주문 = 2
  • 설정 2 : 기기 = 1; 순서 = 1

및 다음 코드 조각을 사용하여 양식을 저장

self.object = machine_form.save() 
settings = setting_formset.save(commit=False) 
for setting in settings: 
    setting.machine = self.object 
    setting.save() 

그럼 내가 = 주문 2 일 설정 저장하려고하지만 설정하고있어 이후 유일한 제약 조건 오류를 2에는 아직도 그 순서가 있습니다. 나는이 문제에 대한 깨끗한 해결책을 찾는 것처럼 보이지 않는다. 내 데이터의 정확성을 보장하기 위해 unique_together 제약 조건을 유지하고 싶습니다. Javascript를 사용하여 프론트 엔드에서이를 해결하는 방법을 알고 있지만 내 모델/양식을 확인하고 싶습니다. formset 행을 반복하는 것은 가능하지만 추악한가요?

class Machine(models.Model): 
    name = models.CharField(max_length=255) 

class Setting(models.Model): 
    name = models.CharField(max_length=255) 
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE) 
    order = models.PositiveSmallIntegerField() 

답변

0

데이터베이스 수준에서 순서를 제한 할 수없는 것처럼 보입니다. 나는 그것이 가능하지 않다는 말은 아니지만, 어떻게해야할지 모르겠다.

지금은 formset에 체크를 추가했습니다. 비슷한 문제가있는 경우에 대비하여 여기에 남겨 두겠습니다.

class BaseSettingFormSet(BaseInlineFormSet): 
    '''FormSet to update the order of Settings in a Machine''' 

    def clean(self): 
     '''Checks if there are no two Settings with the same order.''' 
     if any(self.errors): 
      return 
     orders = [] 
     for form in self.forms: 
      if form.cleaned_data: 
       order = form.cleaned_data['order'] 
       if order in orders: 
        form.add_error('order', _('The order of each setting must be unique')) 
       else: 
        orders.append(order)