Comment ajouter une colonne dans la Table ManyToMany (Django)

À partir de L'exemple du livre Django, je comprends si je crée des modèles comme suit:

from xxx import B

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

Le Django créerait une nouvelle table(A_B) au-delà de la Table A, qui a trois colonnes:

  • id
  • a_id
  • b_id

, Mais maintenant, je veux ajouter une nouvelle colonne dans la Table A_B, ce serait très facile si j'utilise SQL normales, mais maintenant, quelqu'un peut m'aider, comment faire? Je ne trouve aucune information utile dans ce livre.

21
demandé sur Wei Lin 2012-09-24 18:33:02

2 réponses

C'est très facile d'utiliser django aussi! Vous pouvez utiliser through pour définir vos propres tables intermédiaires manytomany

La Documentation fournit un exemple traitant de votre problème:

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, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)
52
répondu dm03514 2018-09-25 10:06:46

Sous le capot, Django crée automatiquement un modèle. Il est possible de modifier les noms de colonne de clé étrangère de ce modèle automatique.

Je n'ai pas pu tester les implications sur tous les scénarios, jusqu'à présent, cela fonctionne correctement pour moi.

Utilisation de Django 1.8 et suivants ' _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 Django 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'
1
répondu ajaest 2018-05-16 13:46:57