2009-06-30 7 views
6

이전 필드에 대해 필드를 자동 증가시키는 방법이 있습니까? 예 : 이전 레코드의 값이 09-0001이면 다음 레코드가 있어야합니다. 09-0002 등등 ... 아이디어를 할당 받았습니까? save 메소드를 오버라이드하는 방법을 생각하고 있는데, 정확히 어떻게 확신 할 수 없습니까?Django의 값을 이전 필드에 대해 자동으로 증가시킵니다.

답변

8

장고는 모델에 둘 이상의 AutoField를 허용하지 않으며 기본 키를 이미 갖고 있습니다. 따라서 save를 오버라이드해야하고, 무엇을 증가 시킬지 알아보기 위해 테이블을 다시 봐야 할 것입니다. 이 같은

뭔가 : 당신의 저장 방법에 잠금 어떤 종류없이, 당신이 (코드 번호에 같은 값을 저장하려고 두 개의 스레드를) 동시성 문제로 실행할 수

class Product(models.Model): 
    code = models.IntegerField() 
    number = models.IntegerField() 
    ... 

    def get_serial_number(self): 
     "Get formatted value of serial number" 
     return "%.2d-%.3d" % (self.code, self.product) 

    def save(self): 
     "Get last value of Code and Number from database, and increment before save" 
     top = Product.objects.order_by('-code','-number')[0] 
     self.code = top.code + 1 
     self.number = top.number + 1 
     super(Product, self).save() 

    # etc. 

참고. SQL에서

+3

덕분에 동시성 문제를 해결할 수 있습니다.'top = Product.objects.select_for_update (nowait = True) .order_by ('--code', '- number') [0]' –

+0

예,'select_for_update()'를 사용하십시오. RDBMS가 먼저 행 잠금을 지원하는지 확인하십시오! (최근의 MySQL과 Postgres가한다). – Seth

1

AutoField는 장고가 모델 기본 클래스 'id'속성에 사용하는 필드 유형이지만 추가적인 자동 증가에 사용할 수 있습니다 전지.

예제와 같이 형식을 지정할 수는 없지만 save() 메서드를 재정 의하여 원하는 형식을 지정하는 사용자 지정 필드 형식을 만드는 것이 좋습니다.

+0

내가 이것을 할 수 있는지 알 겠어 ... 그 필드에 이전 레코드의 값을 검색 한 다음 1을 더 쉽게 입력하는 것과 같은 쉬운 방법이 있다고 생각했습니다. 어쨌든 –

0

:

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| code | int(11) unsigned | NO | PRI | NULL | auto_increment | 
+-------+------------------+------+-----+---------+----------------+ 

장고는 :

self.code = None 
self.number = top.number + 1 
self.save() # or super(Product, self).save() 

저장의 code가 자동으로 증가합니다.

관련 문제