Django中多对多模型中间表中的自定义列名

Django中多对多模型中间表中的自定义列名,django,django-models,django-orm,Django,Django Models,Django Orm,下面是两个模型之间多对多关系的代码块。经过搜索和研究,似乎没有一种优雅的方法可以为Django创建的中间(或链接)表中的外键创建自定义id列名。使用db\u table='pizza\u link\u topping'的自定义名称将创建所需的表名,但表中的列名在出现时不可自定义。Django会自动在模型名称的末尾应用一个_id,有效地生成一个名为topping_id的列和一个名为pizza_id的列 如果我想要自定义名称呢?类似于如何更改表名 class Topping(models.Model

下面是两个模型之间多对多关系的代码块。经过搜索和研究,似乎没有一种优雅的方法可以为Django创建的中间(或链接)表中的外键创建自定义id列名。使用
db\u table='pizza\u link\u topping'
的自定义名称将创建所需的表名,但表中的列名在出现时不可自定义。Django会自动在模型名称的末尾应用一个_id,有效地生成一个名为topping_id的列和一个名为pizza_id的列

如果我想要自定义名称呢?类似于如何更改表名

class Topping(models.Model):
    topping_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = 'pizza_topping'

class Pizza(models.Model):
    pizza_id = models.AutoField(primary_key=True) #custom id column name
    topping = models.ManyToManyField(Topping, db_table='pizza_link_topping')

    def __unicode__(self):
        return self.title

    class Meta:
        db_table = 'pizza'   #custom table name

^谈到使用
db\u列
,但这似乎只适用于
型号。ForeignKey
而不适用于
型号。ManyToManyField
,这正是我需要的

我通过读到了关于使用
的内容,但这很不规范,不是很好。。。


也许我不完全理解通过
是如何工作的,这是正确的方法。

通过
并不是那么刻薄。它正是您想要的:

class Pizza(models.Model):
    ...
    topping = models.ManyToManyField(Topping, through='PizzaLinkTopping')

class PizzaLinkTopping(models.Model):    
    pizza = models.ForeignKey(Pizza, db_column='pizza_noid')
    topping = models.ForeignKey(Topping, db_column='topping_noid')

    class Meta:
        db_table = 'pizza_link_topping'

通常与其他字段一起使用。例如,您可能希望将
权重
字段添加到
PizzaLinkTopping
模型中。它不会产生任何性能开销。没有
django会创建完全相同的表,但它是“隐藏”的。这里唯一的问题是您必须使用此模型来更新M2M数据-
pizza.topping.add()
/
create()
将不起作用。文档中描述了此限制:您的示例创建了3个表:“pizza”、“pizza\u topping”和“hidden”“pizza\u link\u topping”。我的示例创建了完全相同的3个表。唯一的区别是“pizza\u link\u topping”中的字段名。是的,您几乎是正确的:-)
topping=models。ManyToManyField(topping)
(无
通过
)创建
pizza\u topping
表。通过
参数添加
,意味着django应该使用提供的模型,而不应该创建
比萨配料
。在我的示例中,我没有创建
比萨配料
。通过
参数设置
,我告诉django绕过创建
pizza\u topping
,使用
pizza\u link\u topping
而不是
pizza\u topping
pizza\u-link\u-topping
pizza\u-topping
是相同的表,区别仅在于db/列名。您忘记了
topping
表。我在答案中省略了,因为您不需要更改
Topping
类的代码。