gpt4 book ai didi

python-3.x - Django 多对多真的有必要吗?

转载 作者:行者123 更新时间:2023-12-04 02:30:46 24 4
gpt4 key购买 nike

去年我一直在学习使用 Django,而 Python 不是我的母语编程语言。通常,当我想创建多对多关系时,我会创建 3 个表,其中一个包含指向其他两个表中的每一个的两个外键。出于这个原因,我发现 Django manytomany 字段非常不自然。这个多对多字段是否会在数据库中创建第三个表来存储关系?如果是这种情况,则使用多对多字段将阻止类结构直接表示表结构。
我想知道的是,是否有理由我应该使用这个 manytomany 字段,或者我可以使用 3 个类来表示多对多关系吗?
谢谢
标记

最佳答案

I would create 3 tables, one of which contained two foreign keys to each of the other two tables. For this reason, I find the Django manytomany field very unnatural.


这是 正好 Django 在幕后做什么。如果您检查数据库,您将看到 junction table [wiki] . Django 只是在后台执行此操作。它只是将其作为一个字段呈现在前台。正如您在 database Representation of the ManyToManyField 中看到的那样:

Behind the scenes, Django creates an intermediary join table to represent the many-to-many relationship. By default, this table name is generated using the name of the many-to-many field and the name of the table for the model that contains it. Since some databases don’t support table names above a certain length, these table names will be automatically truncated and a uniqueness hash will be used, e.g. author_books_9cdf. You can manually provide the name of the join table using the db_table option.


您甚至可以通过在两者之间显式定义模型来向此连接表添加额外字段,并在 through=… parameter [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)
一个 ManyToManyField因此更像是一个使表示和查询更方便的概念。

关于python-3.x - Django 多对多真的有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64337887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com