Как добавить столбец в таблицу ManyToMany (Django)
Из примера Django Book я понимаю, что я создаю модели следующим образом:
from xxx import B
class A(models.Model):
b = ManyToManyField(B)
Django создаст новую таблицу (A_B) за пределами таблицы A, которая имеет три столбца:
Но теперь я хочу добавить новый столбец в таблицу A_B, поэтому было бы очень легко, если бы я использовал обычный SQL, но теперь кто-нибудь может мне помочь, как это сделать? Я не могу найти полезную информацию в этой книге.
Ответы
Ответ 1
Это очень просто, используя django! Вы можете использовать through
для определения собственных собственных промежуточных таблиц
Документация содержит пример решения вашей проблемы:
Extra fields on many-to-many relationships
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Ответ 2
Под капотом Django автоматически создает сквозную модель. Можно изменить эти имена столбцов внешнего ключа автоматической модели.
Я не мог проверить последствия для всех сценариев, пока он работает правильно для меня.
Использование Django 1.8 и далее _ meta api:
class Person(models.Model):
pass
class Group(models.Model):
members = models.ManyToManyField(Person)
Group.members.through._meta.get_field('person').column = 'alt_person_id'
Group.members.through._meta.get_field('group' ).column = 'alt_group_id'
# Prior to python 1.8 _meta can also be used, but is more hackish than this
Group.members.through.person.field.column = 'alt_person_id'
Group.members.through.group .field.column = 'alt_group_id'