DJANGO中的多对多关系,有或没有关系表

时间:2018-03-07 13:01:33

标签: python django postgresql many-to-many

我是Django的新手。通常,当有多对多的关系时,我会创建一个单独的表来保持关系

有人可以解释如何在Django中做到这一点

这是我的尝试:
一个' Etudiant'可以' Etudier'很多 模块'
a'模块'可以是' Etudier'许多' Etudiant'

class Etudiant(models.Model):
    id_etudiant = models.OneToOneField('Utilisateur', models.DO_NOTHING, db_column='id_Utilisateur', primary_key=True)
    id_groupe = models.ForeignKey('Groupe', models.DO_NOTHING, db_column='id_Groupe')

    class Meta:
        db_table = 'Etudiant'


class Module(models.Model):
    id_module = models.CharField(db_column='id_Module', primary_key=True, max_length=25)
    titre_module = models.CharField(db_column='titre_Module', max_length=25, blank=True, null=True)
    uniteenseignement_module = models.CharField(db_column='uniteEnseignement_Module', max_length=25, blank=True, null=True)
    finsaisie_module = models.IntegerField(db_column='FinSaisie_Module', blank=True, null=True)

    class Meta:
        db_table = 'Module'


class Etudier(models.Model):
    id_etudiant = models.ForeignKey('Etudiant', models.DO_NOTHING, db_column='id_etudiant')
    id_module = models.OneToOneField('Module', models.DO_NOTHING, db_column='id_Module', primary_key=True)

    class Meta:
        db_table = 'etudier'
        unique_together = (('id_module', 'id_etudiant'),)

1 个答案:

答案 0 :(得分:0)

From Django documentation:

  

对于这些情况,Django允许您指定将要使用的模型   用于管理多对多关系。你可以放   中间模型上的额外字段。中间模型是   使用through参数与ManyToManyField 关联   指向将充当中间人的模型。对于我们的音乐家   例如,代码看起来像这样:

 from django.db import models

 class Person(models.Model):
     name = models.CharField(max_length=128)

     def __str__(self):
         return self.name


 class Group(models.Model):
     name = models.CharField(max_length=128)
     members = models.ManyToManyField(Person, through='Membership')

     def __str__(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)