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

时间:2015-01-28 11:01:43

标签: django django-models django-orm

以下是两个模型之间的多对多关系的代码块。经过搜索和研究似乎没有优雅的方法来为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如何运作,这是正确的方法。

1 个答案:

答案 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'