【问题标题】:How do I filter my result by a month and a year that I input?如何按输入的月份和年份过滤结果?
【发布时间】:2023-03-29 08:02:01
【问题描述】:

我正在尝试过滤订单以获取给定月份和年份中销量最高的披萨。 这是目前的代码,但我不知道如何配置它,所以它会根据我输入的月份和年份进行搜索,而不是固定的。

例如,如果我将查询键入为 03 月和 2021 年,那么我应该得到我的对象。我该如何做到这一点?

Fecha 是模型中定义为 fecha = models.DateField(auto_now_add=True) 的日期

obj = Order.objects.filter(fecha__month=month, fecha__year=year).annotate(Max('pizzas__cant')).order_by('-pizzas__cant__max').first()

这是模型:

class Pizzas(models.Model):
   nombre = models.CharField(max_length=100, unique=True)
   cant = models.IntegerField(default=0)

   def __str__(self):
       return self.nombre

class Pedido(models.Model):
   fecha = models.DateField(auto_now_add=True)
   email = models.EmailField(max_length=200, null=True)
   telefono = models.IntegerField(null=True)
   pizzas = models.ManyToManyField('Pizzas', related_name='pedidos', blank=True)
   cantidad = models.IntegerField(default=0)

   def __str__(self):
       return self.email

【问题讨论】:

  • 你能把你的模型添加到问题中
  • 你有 year 变量,对吧?
  • @JPG 就是这样,我不知道。我想要的是使用“fecha”中的年份和月份,这是我的日期字段,这样我就可以输入月份和年份并获取我的对象。
  • @IainShelvington 我添加了它。
  • @satoru 你能更清楚你想要的输出是什么吗?给定年份和月份,您想返回在该时间范围内售出次数最多的 Pizzas 对象?

标签: python django filter


【解决方案1】:

我设法使用稍微不同的模型结构实现了我认为您正在寻找的东西

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


class Sale(models.Model):
    date = models.DateField()
    pizzas = models.ManyToManyField(Pizza, through='SalePizzaThrough', related_name='sales')


class SalePizzaThrough(models.Model):
    pizza = models.ForeignKey(Pizza, on_delete=models.PROTECT)
    sale = models.ForeignKey(Sale, on_delete=models.PROTECT)
    quantity = models.IntegerField()

SalePizzaThrough 是用于 SalePizza 之间的多对多的直通表,并存储该销售中售出的比萨饼数量

我重新创建了你上面给出的场景,下面的代码创建了数据并显示了可用于获取结果的查询

import datetime
from django.db.models import Sum

pizza_1 = Pizza.objects.create(name='Pizza 1')
pizza_2 = Pizza.objects.create(name='Pizza 2')

sale_1 = Sale.objects.create(date=datetime.date(2021, 3, 1))
SalePizzaThrough.objects.create(sale=sale_1, pizza=pizza_1, quantity=4)
SalePizzaThrough.objects.create(sale=sale_1, pizza=pizza_2, quantity=2)

sale_2 = Sale.objects.create(date=datetime.date(2021, 3, 1))
SalePizzaThrough.objects.create(save=sale_2, pizza=pizza_2, quantity=3)

most_sold_pizza = Pizza.objects.filter(
    sales__date__year=2021,
    sales__date__month=3
).annotate(
    total=Sum('salepizzathrough__quantity')
).order_by('-total').first()

【讨论】:

  • 谢谢。这看起来不错,但是由于我更改了模型,出于某种原因,我在 Salepizzathrough 模型中得到了“str 返回非字符串(类型 NoneType)”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多