Django 多对多真的有必要吗?

问题描述 投票:0回答:1

去年我一直在学习使用 Django,而 Python 不是我的母语编程语言。 通常,当我想要创建多对多关系时,我会创建 3 个表,其中一个表包含另外两个表中每个表的两个外键。 因此,我觉得 Django 的 Manytomany 字段非常不自然。 这个多对多字段是否会在数据库中创建第三个表来存储关系? 如果是这种情况,那么使用多对多字段将阻止类结构直接表示表结构。

我想知道是否有理由我应该使用这个多对多字段,或者我可以使用 3 个类来表示多对多关系吗?

谢谢

马克

python-3.x django
1个回答
10
投票

我将创建 3 个表,其中一个包含另外两个表的两个外键。因此,我觉得 Django Manytomany 字段非常不自然。

正是 Django 在幕后所做的事情。如果您检查数据库,您将看到一个连接表 [wiki]。 Django 只是在后台执行此操作。它只是将其作为字段“呈现”到前台。正如您在 ManyToManyField [Django-doc]数据库表示

中看到的:
在幕后,Django 创建一个中间连接表来表示多对多关系

。默认情况下,该表名称是使用多对多字段的名称和包含该字段的模型的表名称生成的。由于某些数据库不支持超过一定长度的表名,因此这些表名将被自动截断并使用唯一性哈希,例如
author_books_9cdf

。您可以使用 db_table 选项手动提供连接表的名称。


您甚至可以通过显式定义其间的模型来向此联结表添加额外的字段,并在 

through=…

参数[Django-doc]

中指定。例如:
class Category(models.Model):
    name = models.CharField(
        max_length=128,
        unique=True
    )

class Item(models.Model):
    name = models.CharField(
        max_length=128,
        unique=True
    )
    categories = models.ManyToManyField(
        Category,
        through='ItemCategory'
        related_name='items'
    )

class ItemCategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    validated = models.BooleanField(default=False)
A 

ManyToManyField
因此更多的是一个使表示和查询更方便的概念。


© www.soinside.com 2019 - 2024. All rights reserved.