访问数据 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
因此不能出版零本,或更多本书。
可能应该反转建模:ForeignKey
从 Book
到 Author
,或者 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(反转ForeignKey
s)和many-to-many(ManyToManyField
s) 这是不可能的。原因是这可能会导致大量带宽。例如,如果一本书有五位作者,这意味着书籍的行重复了五次,导致巨大的响应和缓慢的性能。在这种情况下可以使用 <strong><code>.prefetch_related(…)
。然后这将批量获取所有相关对象,防止 N+1 问题。
如果造型不变,可以在Author
select上查询相关书籍:
Author.objects.filter(<b>book__status='published'</b>).select_related(<b>'book'</b>)
我有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
因此不能出版零本,或更多本书。
可能应该反转建模:ForeignKey
从 Book
到 Author
,或者 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(反转ForeignKey
s)和many-to-many(ManyToManyField
s) 这是不可能的。原因是这可能会导致大量带宽。例如,如果一本书有五位作者,这意味着书籍的行重复了五次,导致巨大的响应和缓慢的性能。在这种情况下可以使用 <strong><code>.prefetch_related(…)
。然后这将批量获取所有相关对象,防止 N+1 问题。
如果造型不变,可以在Author
select上查询相关书籍:
Author.objects.filter(<b>book__status='published'</b>).select_related(<b>'book'</b>)