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 中,我可以访问 Book
的 Author
:
>>> Book.objects.filter(title="War and Peace").first().author.first()
<Author: Leo Tolstoy>
但我无法访问 Author
的 Books
:
>>> Author.objects.filter(name="Leo Tolstoy").first().books.all()
<QuerySet []>
图书未在 Admin
视图中分配:
我想访问 Author
的 Books
以及 Books
在 Author
的 Admin
视图中显示。
你只需要一个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会在book
和author
之间创建两个关联的tabletables。对一个 table 的更改不会影响另一个。你可以在 django 文档中看到关于 many to many relationships。我在我的回答中删除了你的 books
字段,因为你已经创建了你的 Author
的实例,但你没有分配他的 'book' 并且你已经创建了一个 Book
实例title
和 author
在您的 Book
模型中。这样您的任何数据都不会被删除。我还将 related_name
添加到 Book
模型中的 author
字段,因为当您尝试获取与 相关的 books 时作者(例如“Loe Tolstoy”)你可以通过这个得到:
Author.objects.get(name="Leo Tolstoy").books.all()
我的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 中,我可以访问 Book
的 Author
:
>>> Book.objects.filter(title="War and Peace").first().author.first()
<Author: Leo Tolstoy>
但我无法访问 Author
的 Books
:
>>> Author.objects.filter(name="Leo Tolstoy").first().books.all()
<QuerySet []>
图书未在 Admin
视图中分配:
我想访问 Author
的 Books
以及 Books
在 Author
的 Admin
视图中显示。
你只需要一个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会在book
和author
之间创建两个关联的tabletables。对一个 table 的更改不会影响另一个。你可以在 django 文档中看到关于 many to many relationships。我在我的回答中删除了你的 books
字段,因为你已经创建了你的 Author
的实例,但你没有分配他的 'book' 并且你已经创建了一个 Book
实例title
和 author
在您的 Book
模型中。这样您的任何数据都不会被删除。我还将 related_name
添加到 Book
模型中的 author
字段,因为当您尝试获取与 相关的 books 时作者(例如“Loe Tolstoy”)你可以通过这个得到:
Author.objects.get(name="Leo Tolstoy").books.all()