【问题标题】:Django - Annotate with first filtered related objectDjango - 使用第一个过滤的相关对象进行注释
【发布时间】:2021-01-18 16:21:38
【问题描述】:

拥有模型:

class Book(models.Model):
    name = models.CharField(max_length=255)

class Page(models.Model): 
    text = models.TextField()
    page_number = models.PositiveSmallIntegerField()
    book = models.ForeignKey(Book, on_delete=models.CASCADE)

我想根据更改的页码使用 selected_page 注释书籍。
没有要求页码的书籍将有book.selected_page == None

page_number = get_page_number()
books = Book.objects.annotate(???)
# smthing like: Book.objects.annotate(selected_page=Page.objects.filter(page_number=page_number).first())
for book in books:
    if book.selected_page:
        print(book.selected_page.text)

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    您正在寻找SubqueryOuterRefhttps://docs.djangoproject.com/en/3.1/ref/models/expressions/#subquery-expressions

    from django.db.models import OuterRef, Subquery
    selected_page = Page.objects.filter(
        book_id=OuterRef('id'),
        page_number=page_number,
    )
    
    books = Book.objects.annotate(
        selected_page_text=Subquery(selected_page.values('text')[:1]),
    )
    print(books.first().selected_page_text)
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2017-05-05
      • 1970-01-01
      • 2015-08-12
      • 2020-12-23
      • 1970-01-01
      相关资源
      最近更新 更多