2013-11-15 6 views
2

나는 Trac의 데이터베이스를 검사 할 때 내가 얻을 :장고 사용자 정의 기본 키

class TicketChange(models.Model): 
    ticket = models.IntegerField() 
    time = models.BigIntegerField() 
    author = models.TextField(blank=True) 
    field = models.TextField() 
    oldvalue = models.TextField(blank=True) 
    newvalue = models.TextField(blank=True) 
    class Meta: 
     managed = False 
     db_table = 'ticket_change' 

기본 키와 함께 :

>>> TicketChange.objects.all() 
DatabaseError: column ticket_change.id does not exist 
LINE 1: SELECT "ticket_change"."id", "ticket_change"."ticket", "tick... 

나는 PK하지만 ticket_change의 원래 기본 키를 지정해야하기 때문에

Primary key (ticket, time, field) 

그러나 그것은 장고에 가능하지 : Trac에이다 Django Multi-Column Primary Key Discussion.

pk처럼 time을 정의하면 동시에 두 티켓 변경을 추가 할 수 없습니다.

어떻게해야합니까?

답변

1

네가 맞아. 그것은 알려진 문제입니다. 그래서 유일한 솔루션은 해킹 (일종의)입니다.

최상의 옵션은 django-compositepks입니다. 단점은 모델 관계를 실제로 지원하지 않기 때문에 복합 -pk 모델에서 어떤 관계로도 이동할 수 없다는 것입니다. 그러나 TicketChange 모델을 보면이 문제와 관련이 없습니다 (이 모델과 관계가있는 모델이없는 경우).

또 다른 옵션은 id 열을 수동으로 추가하여 (db에 추가 변경 사항을 적용해야 함) 새로운 1 열 기본 키를 만드는 것입니다. 세 번째 옵션 (그리고 아마도 내가할만한)은 처음부터 깨끗하게 새 데이터베이스를 만든 다음 기존 레거시 db에서 데이터를 가져 와서 스크립트로 채우는 것입니다.

미안하지만 더 좋은 해결책이 없습니다. 레거시 dbs와 django는 항상 두통을 겪고 있으며 비슷한 과정을 거쳤습니다. 희망이 도움이!

0

이것은 장고 ORM이 단순히 지원하지 않는 사용 사례입니다. 데이터베이스 스키마를 수정할 수 있다면 Django의 기본 키 역할을 할 추가 열을 추가하십시오 : AUTO_INCREMENT (MySQL) 또는 SERIAL (PostgreSQL)이있는 정수 필드. 새로운 레코드가 삽입 될 때 데이터베이스에 의해 관리되므로 테이블을 사용하여 다른 응용 프로그램을 파괴해서는 안됩니다. ORM을 통해 쿼리를 작성할 때 실제 기본 키를 계속 사용할 수 있습니다.

ticket_change = TicketChange.objects.get(ticket=1234, time=5678, field='myfield') 
관련 문제