Django中的ManyToOneField

vac*_*nti 7 python django

我正在尝试在类中定义一个多对一的字段,即"Many".例如,假设一种情况是用户只能是一个组的成员,但一个组可以有许多用户:

class User(models.Model):
    name = models.CharField()

class Group(models.Model):
    name = models.CharField()
    # This is what I want to do -> users = models.ManyToOneField(User)
Run Code Online (Sandbox Code Playgroud)

Django文档将告诉用户模型中的组字段定义为ForeignKey,但我需要在Group模型中定义关系.据我所知,没有ManyToOneField,我宁愿不必使用ManyToManyField.

Jar*_*die 10

ManyToOne正如您所猜测的那样,一个字段ForeignKey在Django中被调用.您必须在User类上定义它才能使逻辑正常工作,但Django会Groups自动在模型上提供反向属性:

class Group(models.Model):
    name = models.CharField(max_length=64)

class User(models.Model):
    name = models.CharField(max_length=64)
    group = models.ForeignKey(Group)

g = Group.objects.get(id=1)
print g.user_set.all()  # prints list of all users in the group
Run Code Online (Sandbox Code Playgroud)

请记住,Django的模型位于关系数据库的顶部...没有办法在表中定义一个指向多个外键的FK字段(没有M2M,也就是说),因此将ManyToOne关系放在组对象不映射到基础数据存储.如果您正在编写原始SQL,那么在任何情况下,您都可以使用从用户表到组表的外键来建模这种关系,如果它有助于以这种方式来考虑它.ManyToOne如果存在这样的概念,则使用在Group实例上定义的属性的语法和逻辑将比在User上定义的ForeignKey简单得多.