2010-02-06 3 views
2

django 문서에서 이것에 대한 조항을 볼 수 없으므로 사람들은 어떻게해야합니까?사람들은 어떻게 장고에서 클래스 변수를 다루는가?

내 경우는이 경우입니다.

장바구니가 있는데 각 장바구니 인스턴스에 인보이스 번호 필드가 있지만 장바구니가 유료 상태 인 경우에만 송장 번호가 생성되므로 모든 장바구니 인스턴스에 인보이스 번호가 표시되지는 않습니다. 모든 인보이스 번호가 그 사이에 간격없이 순차적으로 표시되도록하려면이 경우 기본 pk가 완벽하지 않아 인보이스 번호의 카운터 역할을하는 클래스 변수가 필요하며 모든 인스턴스가 액세스 할 수 있어야합니다.

+0

DB 필드에 대해 이야기하고 있습니까, 아니면 무엇을 원하십니까? 어쩌면 아이디어를 명확히하기위한 코드를 제공 할 수 있습니까? –

+1

@ user267764 : 모델 클래스에 대해 이야기하고 있습니까? 일반 Python 클래스는 여전히 일반 Python 클래스입니다. 모델 클래스는 뚜렷한 메타 클래스를 가지고 있기 때문에 똑같은 것은 아닙니다. 그러나 그들은 여전히 ​​수업에 불과합니다. 문제가있는 코드의 구체적인 예를 제공 할 수 있습니까? –

+0

그래서 다양한 오브젝트가 공유하는 순차 송장 번호를 원하십니까? 목적은 무엇입니까? –

답변

1

기본 기본 키는 이미 레코드를 삭제하지 않으면 SQLite에서도 고유 한 단조 정수가됩니다. 따라서이 값을 사용할 수 있습니다.

+0

그는 아무런 격차를 원하지 않는다고 말했습니다. 거래가 실패한 경우, PK를 사용하면 아마도 그 거래가있을 것입니다. – piro

0

레거시 데이터베이스 primary_key=True을 마이그레이션하는 경우 모델에 필드를 만들어 기본 키로 지정하거나 현재 기본 키를 사용할 수 있습니다.

Django ORM은 복잡한 키를 지원하지 않습니다. 기본 키가없는 테이블을 사용할 수 없습니다.

인보이스 번호 생성 (예 : 고객 번호 + '-'+ 연도 번호)에 대한 특정 로직이 필요한 경우이 키에 대한 필드를 만들 수 있지만 기본 키는 아닙니다. 이 키가 현재 오브젝트에 대해 아직 지정되지 않은 경우 Model.save 함수에서 오브젝트 저장시이 키 생성 함수를 호출하십시오.

0

은 모델에 송장 필드 유무 : 적절한 때

class Cart(models.Model): 
..... 
invoice_id = models.PositiveIntegerField(null=True,unique=True) 

만 값을 설정합니다. 이 청구서는 더 나은 별도의 모델로 제공 될 수 있음을 나에게 발생 ...

try: 
    nextID = Cart.objects.exclude(invoice_id=None).order_by('-invoice_id')[0].invoice_id + 1 
except IndexError: 
    nextID = 1 

가 좀 더 생각을 갖는

다음 ID를 찾을 수 있습니다. ForeignKey("invoice",null=True)으로 장바구니에 링크 할 수 있습니다. 필요할 때 기본 키 필드를 만들 수 있으며 기본 기본 키 필드는 단조롭게 증가하는 숫자 일 수 있으며 카트 개체에 대한 별도의 라이프 사이클을 가질 수 있습니다.

+0

좋아 보인다. 마지막 인보이스 ID를 움켜 쥐고 다음 인보이스를 저장하는 것이 원자 적 연산 인 경우 더 좋을 것입니다. 그렇게하면 서로 다른 명령으로 서로 다른 발가락을 밟을 수 없다는 것을 절대적으로 확신 할 수 있습니다. Django의 ORM에서 추가 메서드를 사용하면 꽤 가능합니다. –

관련 문제