Python Django ForeignKey关系不起作用
由于外键关系,应该有一个名为“book\u book\u author(s)”的表。否则,我无法访问Author.book\u集Python Django ForeignKey关系不起作用,python,django,Python,Django,由于外键关系,应该有一个名为“book\u book\u author(s)”的表。否则,我无法访问Author.book\u集 class Author(models.Model): name=models.CharField(max_length=255) def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_leng
class Author(models.Model):
name=models.CharField(max_length=255)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=255)
pub_date = models.DateField()
publisher = models.CharField(max_length=255)
language = models.CharField(max_length=255)
print_length = models.DecimalField(max_digits=6, decimal_places=0)
price = models.DecimalField(max_digits=10, decimal_places=2)
authors=models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
数据库:
mysql> show tables;
+-------------------------------+
| Tables_in_eshop |
+-------------------------------+
| account_user |
| account_user_groups |
| account_user_user_permissions |
| auth_group |
| auth_group_permissions |
| auth_permission |
| book_author |
| book_book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+-------------------------------+
12 rows in set (0.00 sec)
如何解决此问题?基本上,当您定义外键时,不会创建新表,而是引用相应的行 在本例中,您正在Book表上创建作者的引用。因此,您可以通过以下方式访问作者的所有书籍:
Book.objects.filter(author__id = 'authorid')
基本上,定义外键时,不会创建新表,而是引用相应行 在本例中,您正在Book表上创建作者的引用。因此,您可以通过以下方式访问作者的所有书籍:
Book.objects.filter(author__id = 'authorid')
应该有一个名为“book\u book\u author”的表格
No:如果您编写了一个ForeignKey
关系,Django将向您的book
表中添加一列,名为author\u id
现在,如果您想为给定的作者
获取书籍
的列表,Django将构造一个如下查询:
SELECT book.*
FROM book
WHERE author_id = 123
使用123
查询的作者的id
。它不构造这样的额外表。这一点都没有好处,因为它基本上会导致相同的查询(尽管是在另一个表上,并且使用连接,这会降低效率)
为了提高效率,Django将默认指示数据库也将在作者id
列上构造索引,以便它可以轻松获得作者id的相关书籍
s。通常这意味着在O(log n)中,甚至O(1)你可以访问由特定作者撰写的书籍列表。根据使用的数据库技术,索引(或大量索引)将存储在数据库中,因此查找速度将非常快
因此,您可以将some\u author.book\u set
视为要执行的查询,而不是表
注意:对于ManyToManyField
s,情况不同,在这种情况下,它将构造一个额外的表。这是因为通常情况下,列不包含任意数量的值(有些数据库可以,但它仍然是不美观的设计)
您可以使用some\u author.book\u set.all()
获取some\u author
的书籍。此外,没有作者.book\u set
(至少属于一位作者的书籍)。在这种情况下,这意味着所有的书,因为每本书都属于作者。如果ForeignKey
可以为NULL,那么我们可以像Books.objects.filter(author\u isnull=False)
一样进行筛选
应该有一个名为“book\u book\u author”的表格
No:如果您编写了一个ForeignKey
关系,Django将向您的book
表中添加一列,名为author\u id
现在,如果您想为给定的作者
获取书籍
的列表,Django将构造一个如下查询:
SELECT book.*
FROM book
WHERE author_id = 123
使用123
查询的作者的id
。它不构造这样的额外表。这一点都没有好处,因为它基本上会导致相同的查询(尽管是在另一个表上,并且使用连接,这会降低效率)
为了提高效率,Django将默认指示数据库也将在作者id
列上构造索引,以便它可以轻松获得作者id的相关书籍
s。通常这意味着在O(log n)中,甚至O(1)你可以访问由特定作者撰写的书籍列表。根据使用的数据库技术,索引(或大量索引)将存储在数据库中,因此查找速度将非常快
因此,您可以将some\u author.book\u set
视为要执行的查询,而不是表
注意:对于ManyToManyField
s,情况不同,在这种情况下,它将构造一个额外的表。这是因为通常情况下,列不包含任意数量的值(有些数据库可以,但它仍然是不美观的设计)
您可以使用some\u author.book\u set.all()
获取some\u author
的书籍。此外,没有作者.book\u set
(至少属于一位作者的书籍)。在这种情况下,这意味着所有的书,因为每本书都属于作者。如果ForeignKey
可以为NULL,那么我们可以像Books.objects.filter(author\u isnull=False)
那样进行筛选,如何查询作者的图书集?您为什么认为应该有一个单独的表?当然不应该。你如何查询你的作者的书集?是什么让你认为应该有一个单独的表?当然不应该了,谢谢。但是我该怎么做才能让它创建一个新表,而不是引用相应的行呢?然后你需要创建一个新表并创建一个多对多的表reference@Jinx:假设我们创建了一个表,那么这将如何改进查询?这只会导致额外的连接
,从而降低查询效率。谢谢。但是我该怎么做才能让它创建一个新表,而不是引用相应的行呢?然后你需要创建一个新表并创建一个多对多的表reference@Jinx:假设我们创建了一个表,那么这将如何改进查询?这只会导致额外的连接
,从而降低查询效率。哦,是的,我明白了。很多地方都是这样的。哦,是的,我明白了。许多领域都是这样运作的。