以下是两个模型之间的多对多关系的代码块。经过搜索和研究似乎没有优雅的方法来为Django创建的中间(或链接)表中的外键创建自定义id列名。使用db_table='pizza_link_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
https://docs.djangoproject.com/en/1.7/ref/models/fields/#django.db.models.Field.db_column
^关于使用db_column
的谈话,但这似乎只适用于models.ForeignKey
,而不适用于我需要的models.ManyToManyField
。
我读过关于使用through
的内容,但这种接缝是破坏性的,并不是很好......
https://docs.djangoproject.com/en/1.7/ref/models/fields/#django.db.models.ManyToManyField.through
也许我并不完全理解through
如何运作,这是正确的方法。
答案 0 :(得分:2)
through
并非如此苛刻。它完全符合您的要求:
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'