【问题标题】:Django ManyToMany model: unable to access one relation from the otherDjango ManyToMany 模型:无法从另一个关系访问一个关系
【发布时间】:2022-01-16 13:00:03
【问题描述】:

我的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。在后台,DJango 在 book 和 author 表之间创建了两个关联表。对一张表的更改不会影响另一张表。

标签: django django-models many-to-many


【解决方案1】:

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

有关更多信息,请参阅Django docs 中的示例。

当在关系的两边创建ManyToManyField 时,Django 正在后台创建 book 和 author 表之间的两个关联表。对一张表的更改不会影响另一张表。

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
    )

【讨论】:

  • 我已经按照您的示例编辑了我的models.py,现在可以像这样访问AuthorBooks&gt;&gt;&gt; Author.objects.get(name="Leo Tolstoy").books.all()
【解决方案2】:

我建议你这样做:

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 表之间创建两个关联表。对一张表的更改不会影响另一张表。您可以在 django 文档中看到有关 many to many relationships 的信息。我在我的回答中删除了您的 books 字段,因为您已经创建了 Author 的一个实例,但您没有分配他的“书”,并且您创建了一个 Book 实例,其中给出了 titleauthor你的Book 模型。这样您的任何数据都不会被删除。我还在Book 模型中的author 字段中添加了related_name,因为当您尝试获取与作者 相关的书籍 时(例如“Loe Tolstoy ") 你可以这样得到:

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

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多