【问题标题】:How to reverse filter based on latest entry in Django如何根据Django中的最新条目反向过滤
【发布时间】:2021-11-30 11:53:59
【问题描述】:

我有一个客户表和客户订单表如下

class Customer(models.Model):
  name = models.CharField()

class CustomerOder(models.Model):
  customer = models.ForiengKey(Customer)
  item = models.CharField()
  datetime_of_purchase = models.DateField()

示例数据库条目

表:客户

id    name
1     A
2     B
3     C

表:客户订单

id   customer   item     datetime_of_purchase
1    A          item_3   2021-11-10 10:00:00
2    A          item_2   2021-11-11 10:00:00
3    B          item_1   2021-11-11 10:00:00
4    A          item_1   2021-11-12 10:00:00
5    B          item_2   2021-11-12 10:00:00
6    C          item_1   2021-11-13 10:00:00

假设我需要过滤最近购买的是“item_1”的客户,所以过滤后的样本应该只得到最近购买的是“item_1”的客户“A”和“C”

Sample:
<QuerySet [<Customer: A>, <Customer: C>]>

【问题讨论】:

    标签: django foreign-keys django-filter


    【解决方案1】:

    您可以通过Subquery expression [Django-doc]获取最新购买的商品:

    from django.db.models import OuterRef, Subquery
    
    Customer.objects.alias(
        latest_purchase=Subquery(
            CustomerOrder.objects.filter(
                customer_id=OuterRef('pk')
            ).order_by('-datetime_of_purchase').values('item')[:1]
        )
    ).filter(latest_purchase='item_1')

    之前,使用.annotate(…) [Django-doc] 而不是.alias(…) [Django-doc]

    from django.db.models import OuterRef, Subquery
    
    Customer.objects.annotate(
        latest_purchase=Subquery(
            CustomerOrder.objects.filter(
                customer_id=OuterRef('pk')
            ).order_by('-datetime_of_purchase').values('item')[:1]
        )
    ).filter(latest_purchase='item_1')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多