【问题标题】:How create one query?如何创建一个查询?
【发布时间】:2020-06-01 11:20:23
【问题描述】:

一个作者有很多书。数据库中有许多作者的书籍。 需要获取作者的最新书籍。在一个查询中。

class Autor(models.Model):
    name = models.Charfield()


class Book(models.Model):
    name = models.Charfield()
    author = models.ForegnKey("Autors", models.CASCADE)
    created_at = models.DatetimeField(auto_now_add=True)

# its a many queries
last_books = []
for author in Autor.objects.all():
    last_book = Book.object.filter(autor=autor).latest("created_at")
    last_books.append(last_book)
# need one query

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    这将在一个查询中得到答案。按作者对书籍进行分组,并获取每个组的最新 created_date。过滤latest_dates中与创建日期匹配的记录

    qs = Book.objects.all()
    latest_dates = qs.values('author').annotate(latest_created_at=Max('created_at'))
    qs = qs.filter(created_at__in=latest_dates.values('latest_created_at')).order_by('-created_at')
    

    【讨论】:

      【解决方案2】:

      你可以简单地使用Subquery:

      from django.db.models import Subquery, OuterRef
      
      books = Book.objects.filter(author=OuterRef('pk'))
      authors = Author.objects.annotate(book=Subquery(books.order_by('-created').values('name')[:1]))
      

      【讨论】:

        【解决方案3】:

        按作者获取所有书籍,按降序排序并获取第一条记录

        latest_books = []
        for author in Author.objects.all():
            last_book = Books.objects.filter(author=author).order_by("-created_at")[0]
            latest_books.append(last_book)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多