Django 如何定义多对多表

Django 如何定义多对多表,django,many-to-many,Django,Many To Many,我在理解Django中的多对多字段时遇到一些困难 创建多对多字段时,例如: class GlobalPart (Models.model): ... category_id=models.ManyToManyField(Category, related_name = 'globalpart') ... 及 我注意到它为globalpart模型创建了一个名为appname\u globalpart\u category\u id的新表 我想知道的是,应该如何定义该表中的

我在理解Django中的多对多字段时遇到一些困难

创建多对多字段时,例如:

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

我注意到它为
globalpart
模型创建了一个名为
appname\u globalpart\u category\u id
的新表

我想知道的是,应该如何定义该表中的字段类型。我认为 应该至少有一个外键用于关联字段。但是,表中有主键,其他字段是整数(
globalpart\u id
category\u id


所以我的问题是,这正常吗?还是我对多对多字段的定义不正确?我的下一个问题是如何获得与特定的
GlobalPart
关联的所有
category\u id

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

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

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

详细回答:对于Category表和GlobalPart表,许多表都需要外键。严格来说,这两个外键应该足够了。你在那里看到的额外pk是为django magic设计的。如果您自己手动定义多对多表,那么您实际上可以只使用该表中的这两个外键。然而,如果你让django为你做这件事(通过使用ManyToManyField),你会得到这个额外的pk

(2) 我建议将模型字段类别id更改为类别:

    class GlobalPart (Models.model):
        categories=models.ManyToManyField(Category, related_name = 'globalpart')
这是因为,ManyToManyFields很好地引用了“许多”项。此字段不是指“一个”类别\u id,而是指所有相关类别。因此,在命名时,自然会相应地命名它

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

categories = global_part.categories.all()
可以使用filter()或exclude()代替all(),方法与查询模型时相同

这里有一个相关的链接

categories = global_part.categories.all()