我在Django中有一个表示一周的模型。我想让某人输入任何日期并让模型自动保存本周的开始。这很简单,只需覆盖保存。
class Week(models.Model):
start_date = models.DateField()
def save(self):
self.start_date = self.start_date - datetime.timedelta(days=date.weekday())
字符串
但我也希望有人能够查询任何一天,并获得周。例如,我希望有人这样做:
this_week = Week.objects.filter(start_date=date.today())
型
其中今天是星期三,并获取week对象,其中日期被设置为一周的开始。它需要对任何日期起作用,而不仅仅是今天。
我知道我们可以在管理器中覆盖get_queryset,但是有没有一种方法可以编辑实际搜索的内容?我能找到的每个管理器示例都只是以静态方式更改了queryset。或者我最好的选择是尝试子类化DateField?
(Note上面的代码是输入的,简化的,可能包含错误,但它在我的实际代码中工作)
2条答案
按热度按时间vzgqcmou1#
我们可以将
DateField
子类化为每次清除一周开始的日期时间。这看起来像:字符串
然后我们可以用
WeekField
来创建、过滤等。例如,我们可以在Week
模型中指定这一点:型
然后使用
.get_or_create(…)
:型
筛选周数:
型
看看本周开始的
.values()
:型
我没有广泛地测试这个,但我想大部分功能都涵盖了。
55ooxyrt2#
在数据库级别,可以根据start_date进行排序,而不是默认的
primary_key
字符串
从这里,它是相当直接向前得到你正在寻找的一周。
型
使用
Meta
的替代方法是在查询中简单地使用order_by
。型