Django中多对多模型中间表中的自定义列名
下面是两个模型之间多对多关系的代码块。经过搜索和研究,似乎没有一种优雅的方法可以为Django创建的中间(或链接)表中的外键创建自定义id列名。使用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
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
类的代码。