Django 中多对多模型的中介 table 中的自定义列名称
Custom column names in Intermediary table for many-to-many model in Django
下面是两个模型之间多对多关系的代码块。经过搜索和研究,似乎没有优雅的方法可以为 Django 创建的中介(或 link)table 中的外键创建自定义 id 列名称。使用 db_table='pizza_link_topping'
的自定义名称会创建所需的 table 名称,但 table 中的列名称不可自定义。 Django 自动将 _id 应用到模型名称的末尾,有效地创建了一个名为 topping_id 的列和一个名为 pizza_id 的列。
如果我想要自定义名称怎么办?类似于我如何更改 table 名称。
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
是如何工作的,这是正确的方法。
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'
下面是两个模型之间多对多关系的代码块。经过搜索和研究,似乎没有优雅的方法可以为 Django 创建的中介(或 link)table 中的外键创建自定义 id 列名称。使用 db_table='pizza_link_topping'
的自定义名称会创建所需的 table 名称,但 table 中的列名称不可自定义。 Django 自动将 _id 应用到模型名称的末尾,有效地创建了一个名为 topping_id 的列和一个名为 pizza_id 的列。
如果我想要自定义名称怎么办?类似于我如何更改 table 名称。
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
是如何工作的,这是正确的方法。
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'