我目前正在为我的一个 Django 项目创建一个简单的日历。日历将显示当前月份和日期。任何有当天商品的日子都会以红色突出显示,以便用户知道当天有商品。元素的数量或元素是什么并不重要。我们关心的只是一天有没有元素。
假设我有以下模型。
class Items(models.Model):
name = models.CharField(max_length=140)
datetime = models.DateTimeField(auto_now_add=False)
def save(self, *args, **kwargs):
if datetim is None:
created = datetime.now()
super(Items, self).save()
这是我目前查找哪些日子有元素的逻辑:
from calendar import monthrange
# Find number of days for June 2015
num_days = monthrange(2015, 6)[1]
days_with_items = []
'''
Increase num_days by 1 so that the last day of the month
is included in the range
'''
num_days =+ 1
for day in range(0, num_days):
has_items = Items.objects.filter(datetime__day = day,
datetime__month = 6,
datetime__year = 2015).exists()
if has_items:
days_with_items.append(day)
return days_with_items
这会返回一个列表,其中包含所有有项目的日期。这是可行的,但是我正在寻找一种更有效的方法来执行此操作,因为 Django 会多次访问数据库以获取 .exists()
有什么建议吗?
最佳答案
我看到两种可能的选择。第一个是在数据库级别添加计数,第二个是在 python 级别对可用数据进行有效循环。根据数据大小和数据库效率,您可以选择最适合您的。
数据库中的计数解释如下: Django ORM, group by day
或者解决方案二,一个简单的脚本(不是那么优雅......但只是作为一个例子):
days_with_items_hash = {}
items = Items.objects.filter(
datetime__month = 6,
datetime__year = 2015
)
for item in items:
days_with_item_hash[item.datetime.day] = True
days_with_item = days_with_item_hash.keys()
我会坚持使用数据库解决方案,因为它可以优化(sql View 、仅包含日期的额外列等)
关于python - Django :哪几天有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741987/