访问数据 ForeignKey django 逆向方式

access data ForeignKey django reverse way

我有2个模型

class Book(models.Model):
  STATUS_CHOICES = (
      ('draft', 'Draft'),
      ('published', 'Publish')
    )
  name = models.CharField(max_length= 500)
  status = models.CharField(max_length = 10, 
                            choices = STATUS_CHOICES, 
                            default = 'draft')

class Author (models.Model):
  name = models.CharField(max_length)
  book = models.ForeignKey(Book, on_delete=models.CASCADE)

现在我想实现对书籍的查询 table 并获取作者,我也不想对作者应用查询,myquery 应该是这样的

select * from book left join ON book.id = author.book_id where book.status = 'published'

我如何在 django 中实现它

造型看起来奇怪。现在这意味着 Author 出版 正好 一本书。一本Author因此不能出版零本,或更多本书。

可能应该反转建模:ForeignKeyBookAuthor,或者 ManyToManyField [Django-doc],以防 Book 可以有多个作者:

class Book(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Publish')
      )
    name = models.CharField(max_length= 500)
    status = models.CharField(
        max_length=10, 
        choices = STATUS_CHOICES, 
        default = 'draft',
        <b>db_index=True</b>
    )
    <b>author</b> = models.<b>ForeignKey(</b>
        'Author',
        related_name='books',
        on_delete=models.CASCADE
    <b>)</b>

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

可以 select 由 one-to-one (OneToOneField) 或 many-to-one 关系 (ForeignKey) 和 .select_related(…) [Djanngo-doc] 子句限定的对象:

Book.objects.filter(status='published')<b>.select_related('author')</b>

然后 Author 的数据也被 select 编辑,Django 会将其包装在您可以访问的 Author 对象中,就像您访问 ForeignKey 懒洋洋地,用 <i>mybook.</i>author.

对于one-to-many(反转ForeignKeys)和many-to-manyManyToManyFields) 这是不可能的。原因是这可能会导致大量带宽。例如,如果一本书有五位作者,这意味着书籍的行重复了五次,导致巨大的响应和缓慢的性能。在这种情况下可以使用 <strong><code>.prefetch_related(&hellip;) 。然后这将批量获取所有相关对象,防止 N+1 问题。

如果造型不变,可以在Authorselect上查询相关书籍:

Author.objects.filter(<b>book__status='published'</b>).select_related(<b>'book'</b>)