Django ManyToMany 模型:无法从另一个访问一个关系

Django ManyToMany model: unable to access one relation from the other

我的models.py:

class Author(models.Model):
    name = models.CharField(max_length=100)
    books = models.ManyToManyField(
        "Book", related_name="books", blank=True
    )

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ManyToManyField(Author)

Django admin中我首先创建了一个Author的实例,没有给他分配任何Book:

然后我创建了一个新的 Book 并将 Leo Tolstoy 指定为 Author:

在 Django shell 中,我可以访问 BookAuthor:

>>> Book.objects.filter(title="War and Peace").first().author.first()
<Author: Leo Tolstoy>

但我无法访问 AuthorBooks:

>>> Author.objects.filter(name="Leo Tolstoy").first().books.all()
<QuerySet []>

图书未在 Admin 视图中分配:

我想访问 AuthorBooks 以及 BooksAuthorAdmin 视图中显示。

你只需要一个ManyToManyField。您还应该将 "books" 作为 related_name 传递给 Book.authors,因为这是 Django 将用于自动添加到 Author 实例的多对多管理器属性的名称。

有关详细信息,请参阅 Django docs 中的示例。

当在关系的两侧创建 ManyToManyField 时,Django 会在后台创建书和作者 table 之间的两个关联 table。对一个 table 的更改不会影响另一个。

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(
        Author, related_name="books", blank=True
    )

我建议你这样做:

class Author(models.Model):
    name = models.CharField(max_length=100)
                
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ManyToManyField(Author, related_name="books",blank=True)

你需要一个 ManyToManyField,然后django会在bookauthor之间创建两个关联的tabletables。对一个 table 的更改不会影响另一个。你可以在 django 文档中看到关于 many to many relationships。我在我的回答中删除了你的 books 字段,因为你已经创建了你的 Author 的实例,但你没有分配他的 'book' 并且你已经创建了一个 Book 实例titleauthor 在您的 Book 模型中。这样您的任何数据都不会被删除。我还将 related_name 添加到 Book 模型中的 author 字段,因为当您尝试获取与 相关的 books 时作者(例如“Loe Tolstoy”)你可以通过这个得到:

Author.objects.get(name="Leo Tolstoy").books.all()