2013-08-02 35 views
2

我正在为django中的java应用程序构建一个UI。我想根据JPA创建的表创建Java表。为此,当我使用ManyToMany字段时,新创建的中间表具有与JPA不匹配的列名称。Django ManyToMany字段上的自定义列名称

有没有什么办法可以给表中的列提供自定义名称所以,以避免在Java中出现Missing列错误。

任何帮助将非常感激。

回答

12

您可以不指定任何额外的字段指定自定义through模型。然后你就可以在ForeignKey领域使用db_column=...

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

有没有办法在不创建“穿透”模型的情况下做到这一点?我想在ManyToMany中间表中有一个自定义的外键列。有没有办法让ManyToManyField把db_column作为参数? –

+1

@klandshome总有一种方法。有没有好的方法?当然不。您*可以*在* 上直接设置'db_column'。 。through。 '在模型定义之后(例如'class_prepared'信号),但不能保证其他代码在更改之前不会使用模型。 – knbk

1

我认为你可以使用db_column参数来完成此操作。

这看起来像:my_m2m_field=models.ManytoManyField(Model, db_name="Desired Name")

+0

我试过使用这个以及db_column也,但它绝不改变列名。 – Akshay

+0

@Akshay你删除了生成的表并且再次运行'syncdb'吗? Django本身不能改变现有的表。 –

+0

是的,在对代码进行一些更改以后,我总是删除现有的表。到目前为止,已经有很多不同的方法但没有成功。我觉得它必须是非常微不足道的东西。 – Akshay

0

正如上面提到的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') 

在此之后的管理控制台上显示出来,必须使用内联这样既车型可以同时改变。(我认为这是再次的选择/要求的事)。该办法做到这是,

在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,巴德明)

该模型可在注册过模拟你想要的。

+0

希望这有助于:) – Akshay