将手动创建 Table 映射为 Django 中的 M2M
Map Mannually Created Table as M2M in Django
我有 table T1(文本中使用的所有单词列表)和 T2(文本列表)。
我创建了另一个 Table T3,它带有指向 T1 和 T2 的外键,以便它可以在 T3 中充当 M2M。我另外添加了另一个名为 WordCount 的列,所以我无法创建这个 table with models.ManyToMany 字段!我可以使用 Django ORM 中的多对多约束从 T1 访问 T2 吗?
我认为您需要在多对多模型中使用 "through"
属性:
这是我从中得到的一个简单示例 link:
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)
我有 table T1(文本中使用的所有单词列表)和 T2(文本列表)。
我创建了另一个 Table T3,它带有指向 T1 和 T2 的外键,以便它可以在 T3 中充当 M2M。我另外添加了另一个名为 WordCount 的列,所以我无法创建这个 table with models.ManyToMany 字段!我可以使用 Django ORM 中的多对多约束从 T1 访问 T2 吗?
我认为您需要在多对多模型中使用 "through"
属性:
这是我从中得到的一个简单示例 link:
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)