2013-08-02 2 views
2

django에서 Java 어플리케이션 용 UI를 빌드 중입니다. JPA에서 만든 테이블에 따라 Java 테이블을 생성하려고합니다. 이를 위해 ManyToMany 필드를 사용할 때 새로 생성 된 중간 테이블에는 JPA와 일치하지 않는 열 이름이 있습니다.Django ManyToMany 필드의 사용자 정의 컬럼 이름

자바에서 누락 된 열 오류가 발생하지 않도록으로 난, 그래서 테이블의 컬럼에 사용자 이름을 줄 수있는 방법이 있습니까.

도움이 될 것입니다.

답변

12

. 그런 다음 ForeignKey 분야에서 db_column=...을 사용할 수 있습니다 : 그것은 위에서 언급 한 knbk으로

class A(models.Model): 
    ... 

class B(models.Model): 
    a = models.ManyToManyField(A, through='C', db_table='customtablename') 

class C(models.Model): 
    a = models.ForeignKey(A, db_column='customcolumnname') 
    b = models.ForeignKey(B, db_column='secondcustomcolumnname') 
+0

감사합니다. 그러나 나는 'through'를 사용할 때 필수적이라고 생각하는 디스플레이를 위해 몇 가지를 추가했습니다. – Akshay

+0

"through"모델을 만들 필요없이 이것을 수행 할 수있는 방법이 있습니까? ManyToMany 중개 테이블에 사용자 지정 외래 키 열을 갖기 위해 노력하고 있습니다. ManyToManyField가 db_column을 인수로 삼는 방법이 있습니까? –

+1

@klandshome 항상 방법이 있습니다. 좋은 방법이 있습니까? 기필코 아니다. 당신은'에 직접 db_column을 설정할 수 있습니다. . through. '모델 정의 (예 :'class_prepared' 신호) 이후에 변경되지만 다른 코드가 변경하기 전에 모델을 사용하지 않을 것이라는 보장은 없습니다. – knbk

1

db_column 매개 변수를 사용하여이 작업을 수행 할 수 있다고 생각합니다.

처럼이 보인다 : 당신은 어떤 추가 필드를 지정하지 않고 사용자 정의 through 모델을 지정할 수 있습니다 my_m2m_field=models.ManytoManyField(Model, db_name="Desired Name")

+0

나는 db_column과 db_column도 사용하려고 시도했지만 열의 이름을 변경하지는 않습니다. – Akshay

+0

@Akshay 생성 된 테이블을 삭제하고'syncdb'를 다시 실행 했습니까? 장고는 자체적으로 존재하는 테이블을 변경할 수 없습니다. –

+0

예, 테스트를 위해 코드를 변경 한 후에 기존 테이블을 항상 삭제합니다. 지금까지는 여러 접근법을 시도했지만 성공하지 못했습니다. 나는 그것이 아주 사소한 것이되어야한다고 생각한다. – Akshay

0

참으로 나가는 길이며, 다음은 내가 그것을했을 완벽한 방법입니다. 이 후

class A(models.Model): 
.... 

class B(models.Model): 
    a = models.ManyToManyField(A,through = 'C', db_table = 'customtablename') 

class C(models.Model): 
    a = models.ForeignKey(A,db_column='customcolumnname') 
    b = models.ForeignKey(B,db_column='secondcustomcolumnname') 

관리 콘솔에 표시를위한, 당신은 모델이 동시에 변경을 할 수 있도록 인라인을 사용해야합니다. 할 수 국지적 인 방법으로 (내가 다시 선택/요구 사항의 문제라고 생각한다) 이이며,이 모델이있는 등록 할 수 있습니다 admin.py

class ABInline(admin.TabularInline): 
    model = B.a.through 

class AAdmin(admin.ModelAdmin): 
    inlines = [ABInline,] 

class BAdmin(admin.ModelAdmin): 
    inlines = [ABInline,] 
    exclude = ('a',) 

admin.register.site에서

(B, BAdmin)

이제까지 당신이 원하는 모델.

+0

희망이 도움이 :) – Akshay

관련 문제