Django通用类视图中如何过滤匹配今日星期的ManyToManyField字段
代码问题定位
你现在的查询跑不对是两个问题叠在一起导致的,改完就能直接用:
- 第一处是星期判断的逻辑完全失效
datetime对象的.weekday()方法返回的是整数(0代表周一、1代表周二一直到4代表周五),但你原来写的判断条件是拿这个整数和字符串格式的'0'、'1'比,条件永远不会触发,最后today_weekday只会保留一开始赋的整数0,根本不会被改成对应的星期名称。 - 第二处是多对多字段的过滤写错了
weekday是关联Weekday模型的多对多字段,本身不直接存星期名字的字符串。原来直接写.filter(weekday=today_weekday)的时候,Django会把传进去的值当成Weekday模型的主键去匹配,自然筛不到正确的结果。
可直接复用的修正代码
today = datetime.date.today() # 用索引映射替换原来的5段if判断,从根源上避免类型不匹配的bug weekday_name_map = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] today_weekday_name = weekday_name_map[today.weekday()] queryset = queryset.filter(agent__user=user).filter( class_start_date__lte=today, class_end_date__gte=today, ).filter(weekday__name=today_weekday_name)
这里的
weekday__name默认假设你的Weekday模型里,存储星期名称的字段叫name,如果实际定义的字段名不一样,把name替换成你模型里存星期值的字段名就行。这种跨关联字段的匹配写法,会直接筛选出“关联的Weekday集合中包含当日星期”的模型实例,Django会自动对多对多匹配的结果去重,不会出现重复的数据条目。
内容的提问来源于stack exchange,提问作者coderDcoder
相关产品推荐
相关产品推荐

