datetime的小坑
在做悦运动这个项目时,在创建约运动关系表时,运动开始时间,注意(导入datetime包时,我导入的是class datetime(__datetime.date)这个类,可以调用这个类中的方法,调用当前时间直接可以调用datetime.now()
from datetime import datetime
......
class Schedule(models.Model):
'''
发起约运动
'''
Status = ((1, '已完成'), (2, '待人加入'), (3, '已取消'))
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name='发起人')
join_type = models.BooleanField(verbose_name='是否发起人')
now_people = models.IntegerField(verbose_name='已有人数', null=True, blank=True)
school = models.ForeignKey(Schools, on_delete=models.CASCADE, verbose_name='学校', default='')
sport = models.ForeignKey(Sports, on_delete=models.CASCADE, verbose_name='运动项目')
address = models.CharField(verbose_name='约定地点', max_length=100)
sport_time = models.DateTimeField(verbose_name='约定运动开始时间')
sport_end_time = models.DateTimeField(verbose_name='约定运动结束时间', default='')
people_nums = models.IntegerField(verbose_name='人数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
status = models.IntegerField(choices=Status, verbose_name='状态') class Meta:
verbose_name = '发起约运动'
verbose_name_plural = verbose_name def __str__(self):
return self.sport.sport_name + '-' + str(self.sport_time) class JoinSchedule(models.Model):
'''
加入的运动
'''
schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE, verbose_name='加入的运动')
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name='用户')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间') class Meta:
verbose_name = '加入运动'
verbose_name_plural = verbose_name def __str__(self):
return str(self.schedule_id) + '--' + str(self.user_id)
而在序列化该表时,导入的是datetime:class datetime,包含了datetime这个模块所有方法,获得当前时间可以datetime.datetime.now(),如第十五行
import datetime
class MyJoinScheduleSerializer(serializers.ModelSerializer):
'''
加入约运动序列化
'''
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') def create(self, validated_data):
user = self.context['request'].user
schedule = validated_data['schedule']
if Schedule.objects.filter(user=schedule.user, id=schedule.id).first().user == user:
raise serializers.ValidationError('您是该运动的发起人,已默认加入')
double_status = False
schedules = JoinSchedule.objects.filter(user=user,schedule__sport_time__gt=datetime.datetime.now())
if schedules:
for s in schedules:
if s.schedule.sport_time > schedule.sport_end_time or schedule.sport_time >= s.schedule.sport_end_time:
pass
else:
double_status = True
break
if double_status:
raise serializers.ValidationError({"time_error":"与你已有的预约运动时间冲突"})
else:
existed = JoinSchedule.objects.create(**validated_data)
return existed class Meta:
model = JoinSchedule
fields = '__all__'
validators = [
UniqueTogetherValidator(
queryset=JoinSchedule.objects.all(),
fields=('user', 'schedule'),
message='已经加入'
)
]
运行测试时会报错;type object 'datetime.datetime' has no attribute 'datetime'(对象'datetime.datetime'类型没有属性'datetime'),原因:
from datetime import datetime 已经相当于把命名空间引入到datetime.datetime一层,而在序列化时,又是import datetime,调用datetime.datetime.noe()会让编译器在datetime.datetime空间下去找datetime类。
但是datetime类是应该在datetime空间下的,所以会报错,主要是由于两个datetime不是一个等级的。
datetime的小坑的更多相关文章
- MySQL中字段类型为timestamp的小坑
之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...
- mciSendString 的两个小坑
刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 使用EMMET中的小坑
使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...
- 关于CSS3中transform变换的小坑
2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...
- Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理
基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...
- go的变量redeclare的问题,golang的一个小坑
go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int 然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...
- mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会
<property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...
随机推荐
- mybatis基础系列(三)——动态sql
本文是Mybatis基础系列的第三篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(二)--基础语法.别名.输入映射.输出映射 mybatis基础系列(一)--mybatis入门 动态 ...
- Cookie、sessionStorage与localStorage的区别
(1) sessionStorage 保存数据的方法: SessionStor.setItem(“key”,”value”) 或者写成 sessionStorage.key=”value” 读取数据的 ...
- 分布式计算(四)Azkaban安装
Azkaban是一个批量工作流任务调度器,使用Java语言开发.用于在一个工作流内以一个特定的顺序运行一组工作和流程.Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web ...
- BLDC
BLDC working principle: https://www.bilibili.com/video/av31423350?from=search&seid=1569792618769 ...
- MySQL(十四)管理维护及性能优化
关于MySQL的学习,<MySQL必知必会>这本书呢,看完已经两个月了,一直被工作以及生活的一些琐事拖着,趁着今晚有空闲,就整理完了最后的几章学习笔记,接下来的学习计划呢, 应该是pyth ...
- 解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题
如果你的操作系统是Win7 64位,在运行Skyline6.5提供的ITE3DWindowEx控件实现多球对比时,启动程序调试运行时,却自动运行了TerraExplorer软件, 这时候你会发现for ...
- C# 邮箱的使用
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configurat ...
- [10] AOP的注解配置
1.关于配置文件 首先在因为要使用到扫描功能,所以xml的头文件中除了引入bean和aop之外,还要引入context才行: <?xml version="1.0" enco ...
- Linux系列教程(七)——Linux常用命令之帮助和用户管理命令
上篇博客我们介绍了Linux文件搜索命令,其中find是用的最多的也是功能最强大的文件或目录搜索命令,和另一个搜索命令locate的区别是,find命令是全盘搜索,刚创建的文件也能搜索的到,而loca ...
- Hive 实现 wordcount
创建表: create table hive_wordcount(context string); load data local inpath '/home/hadoop/files/hellowo ...