Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ForeignKey关系不起作用_Python_Django - Fatal编程技术网

Python Django ForeignKey关系不起作用

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

由于外键关系,应该有一个名为“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_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:假设我们创建了一个表,那么这将如何改进查询?这只会导致额外的
连接
,从而降低查询效率。哦,是的,我明白了。很多地方都是这样的。哦,是的,我明白了。许多领域都是这样运作的。