Подтвердить что ты не робот

Как добавить столбец в таблицу ManyToMany (Django)

Из примера Django Book я понимаю, что я создаю модели следующим образом:

from xxx import B

class A(models.Model):
    b = ManyToManyField(B)

Django создаст новую таблицу (A_B) за пределами таблицы A, которая имеет три столбца:

  • ID
  • a_id
  • b_id

Но теперь я хочу добавить новый столбец в таблицу A_B, поэтому было бы очень легко, если бы я использовал обычный SQL, но теперь кто-нибудь может мне помочь, как это сделать? Я не могу найти полезную информацию в этой книге.

4b9b3361

Ответ 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'