【问题标题】:Django Querying ManytoMany fieldDjango查询多对多字段
【发布时间】:2020-04-17 12:32:34
【问题描述】:

我正在创建一个简单的 django 项目,该项目处理存储书籍和作者的名称以及存储待读列表 (TBR)。 TBR 表以多对多方式连接到 books 表。

现在,我对如何查询特定 TBR 中的书籍列表感到困惑。

我写的代码如下:

class BookManager(models.Manager):
    def is_read(self):
        return self.filter(read='y')

    def is_not_read(self):
        return self.filter(read='n')

class Genre(models.Model):
    name = models.CharField(max_length=200, help_text='Enter a book genre (e.g. Science Fiction)')

    def __str__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=100, help_text="Enter first name of the author",default="Unknown")
    last_name = models.CharField(max_length=100, help_text="Enter last name of the author",default="Unknown")

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

class Book(models.Model):

    YES = 'y'
    NO = 'n'

    DID_READ_CHOICES = [
        (YES,'Yes'),
        (NO,'No'),
    ]

    title = models.CharField(max_length=100)
    author = models.ForeignKey(
        Author,
        on_delete=models.SET_NULL, 
        null=True,
        related_name='author_books'
        )
    genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')
    summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book',blank=True,null=True)
    read = models.CharField(
        max_length=1,
        choices=DID_READ_CHOICES,
        default=NO,
        )

    objects = BookManager()

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

class TBR(models.Model):
    title = models.CharField(max_length=100)
    book = models.ManyToManyField(
        Book,
        related_name='in_tbr',
        )

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

我是 Django 新手,我指的是 Django 文档,我们将不胜感激。

谢谢

编辑:我尝试了以下方法:

>>> to_be_read = TBR.objects.get(title='TBR1')
>>> for book in to_be_read.book:
...     book.title
...

但出现以下错误:

回溯(最近一次通话最后一次):
文件“”,第 1 行,在
TypeError: 'ManyRelatedManager' 对象不可迭代

【问题讨论】:

  • 让我更好地理解你的问题。您需要根据 TBR 模型中的“标题”查询图书列表吗?
  • 是的,例如有一个名为“一生中必读的书”的 TBR,现在在 10 本书中只有 7 本书是这个 TBR 的一部分。现在我只想根据 TBR 查询这 7 本书。
  • 只是一个建议:最好在 Book 模型中为 TBR 创建一个新的类别字段(因此您可以根据需要创建许多类别 - 例如“一生中阅读的书籍”并与这本书并根据此字段进行查询)和一个 BooleanField 来检查它是否是 TBR?告诉我这对你是否有意义,因为这样生活会更轻松。如果没有,我会再做一个解决方案。
  • 其实,我是为我的妈妈做的,她是一个狂热的读书人。她在 pinterest 上找到了这个 TBR,并试图获取所有的 pdf。由于没有办法管理它成为一个集群。因此我决定为她做这个,她可以添加她的 TBR 并添加所有可用书籍列表中的书籍。

标签: django django-models django-queryset


【解决方案1】:

你应该使用book.all()

试试这个

>>> to_be_read = TBR.objects.get(title='TBR1')
>>> for book in to_be_read.book.all():
...     book.title
...

【讨论】:

  • 非常感谢,它有效。我被困了一段时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2013-05-17
相关资源
最近更新 更多