2012-07-26 59 views
1

我在理解Django中的多对多字段时遇到了一些麻烦。如何定义多对多表格

当我创建了一个多到许多领域,例如:

class GlobalPart (Models.model): 
    ... 
    category_id=models.ManyToManyField(Category, related_name = 'globalpart') 
    ... 

class Category (Model.model): 
    ... 
    category = models.CharField(max_length=250) 
    ... 

我注意到,它创造了一个新的表,除了叫appname_globalpart_category_idappname_globalpart表的GlobalPart模型。

我想知道的是,如何定义该表中的字段类型。我认为 应该至少有一个外键来关联字段。但取而代之的是表的主键,其他字段是整数(globalpart_idcategory_id)。

所以我的问题是 - 这是正常的吗?还是我以某种方式错误地定义了多对多字段?而我的下一个问题是,我将如何获得与特定GlobalPart关联的所有category_ids

回答

1

(1)简答:是的,这是正常的。

长答案:ManyToMany表需要一个外键给Category和GlobalPart表。严格地说,这两个外键应该是足够的。你在那里看到的额外的pk只是为了django魔术。如果您自己手动定义多对多表,那么只能使用该表中的这两个外键。但是,如果你让Django的为你做它(通过使用ManyToManyField),你得到这个额外的PK

(2)我建议改变模型的领域CATEGORY_ID至类别:

class GlobalPart (Models.model): 
     categories=models.ManyToManyField(Category, related_name = 'globalpart') 

这是因为,ManyToManyFields指好到“许多”项目。本栏位不涉及“one”category_id,它指的是全部相关类别。因此,在命名时相应地命名它是很自然的。

至于访问所有类别,你可以通过访问“类别”属性来做到这一点。说,如果你的对象实例名为global_part,您可以访问的类别是这样的:

categories = global_part.categories.all() 

而是所有(),你可以使用过滤器()或排除()查询您模型时,使用同样的方式。

这是有关的链接django docs

1

你认为外键是什么?它是一个包含值的字段,这些值等同于“外部”表中的ID(通常是主键)。如果其他表具有整数键,就像大多数Django表所做的那样,那么外键字段也将是integer类型。

此外,Django创建约束,以便数据库强制ID确实在外表中引用有效值。根据您的数据库,这些可能会或可能不会显示为字段定义的一部分。