首页 文章

将手动创建的表映射为Django中的M2M

提问于
浏览
-1

我有表T1(文本中使用的所有单词的列表)和T2(文本列表) .

我创建了另一个表T3,其中包含T1的外键和T2,因此可以在T3中充当M2M . 我另外添加了另一个名为WordCount的列,因此我无法使用models.ManyToMany Field创建此表!我可以在Django ORM中使用多对多约束来从T1访问T2吗?

1 回答

  • 0

    我认为您需要多对多模型中的 "through" 属性:

    这是我从这个链接得到的一个简单例子:

    https://gist.github.com/jacobian/827937

    你可以在这里找到更多相关信息:

    https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ManyToManyField.through

    在这种情况下,该示例的人员具有多对多的组 . 但是我们需要在关系上添加一些额外的字段,因此我们创建了一个名为Group Member的直通模型 . 请注意,中间模型GroupMember具有Person和Group的外键,以及您可能需要的其他一些字段 .

    当您编写这样的模型时,Django的ORM会处理约束 .

    from django.db import models
    
    
    class Person(models.Model):
        name = models.CharField(max_length=200)
        groups = models.ManyToManyField('Group', through='GroupMember', related_name='people')
    
        class Meta:
            ordering = ['name']
    
        def __unicode__(self):
            return self.name
    
    class Group(models.Model):
        name = models.CharField(max_length=200)
    
        class Meta:
            ordering = ['name']
    
        def __unicode__(self):
            return self.name
    
    class GroupMember(models.Model):
        person = models.ForeignKey(Person, related_name='membership')
        group = models.ForeignKey(Group, related_name='membership')
        type = models.CharField(max_length=100)
    
        def __unicode__(self):
            return "%s is in group %s (as %s)" % (self.person, self.group, self.type)
    

相关问题