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_id除了模型的appname_globalpart表之外,它还创建了一个名为的新表GlobalPart

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

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

4

2 回答 2

1

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

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

于 2012-07-26T15:43:23.807 回答
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 很好地引用了“许多”项目。该字段不引用“一个”category_id,它引用所有相关类别。因此,在命名时,相应地命名它是很自然的。

至于访问所有类别,您可以通过访问“类别”属性来完成。假设您的对象实例名为 global_part,您可以访问如下类别:

categories = global_part.categories.all()

代替 all(),您可以使用 filter() 或 exclude(),就像在查询模型时使用它一样。

这是相关django 文档的链接

于 2012-07-26T16:18:03.507 回答