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'