2017-03-10 4 views
1

두 모델 인 Box 모델과 Thing 모델이 있다고 가정 해 봅시다. 마지막 하나는 Box를 외래 키로 사용합니다. 각 상자는 사용자가 ModelForm을 사용하여 추가 할 수있는 문자열 객체의 컨테이너로 작동합니다. models.py 이런 식으로 뭔가해야한다 : 지금단어의 반복에 따라 모델 정수 필드를 늘리십시오.

models.py

class Box(models.Model): 
name = models.CharField(max_length=120, unique=True) 

def __str__(self): 
    return self.name 

class Things(models.Model): 
    box = models.ForeignKey(Box) 
    name = models.CharField(max_length=120) 
    thing_number = models.PositiveIntegerField(default=1) 

    def __str__(self): 
     return self.name 

때마다 사용자가 양식에 같은 문자열을 삽입, 나는 "thing_number 증가하고 싶습니다 "정수 필드 1. 쉽게 그렇게 할 수 있습니까?

+0

'forms.py' 파일에서 수정해야합니다. 귀하의'forms.py'를 (를) 공유 할 수 있었습니까? –

+0

왜 이것을 필요로합니까? PK에 어떤 문제가 있습니까? – e4c5

+0

전혀 문제가 없지만 모델 필드의 변경은 양식 입력에 따라 다르므로 IMO에서는 '증분 작업'을 'clean_name' 메소드 내에 포함 시켰습니다. –

답변

1

thing_numberThing 필드의 기본값을 0으로 설정해야한다고 생각합니다. 이렇게하면 는, 당신은

thing, created = Things.objects.get_or_create(box=your_box, name=thing_name) 
thing.things_number += 1 
thing.save() 

다른 현명한으로 살아라 수를 늘릴 수 있습니다 : ----

thing, created = Things.objects.get_or_create(box=your_box, name=thing_name, 
               default={'thing_number':0}) 
thing.things_number += 1 
thing.save() 

추가

@ e4c5은 위의 코드 인종의 원인이 말했듯 조건은 다음과 같이 바뀔 수 있습니다 :

Things.objects.get_or_create(box=your_box, name=thing_name, default={'thing_number':0}) 
Things.objects.filter(box=your_box, name=thing_name).update(thing_number=F('thing_number') + 1) 
+1

이것은 경쟁 조건으로 이어집니다 – e4c5

+0

귀하의 조언에 따라 답변이 변경되었습니다. Thx – weidwonder

+0

그런 다음 모든 상자에 대해 'Thing'이름이 같은 이름으로 유지해야합니다. 당신을 위해서, 당신은 ('name','box_id') 컬럼을 가진 데이터베이스에 유일한 키를 추가해야합니다 – weidwonder