在做悦运动这个项目时,在创建约运动关系表时,运动开始时间,注意(导入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的小坑的更多相关文章

  1. MySQL中字段类型为timestamp的小坑

    之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...

  2. mciSendString 的两个小坑

    刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...

  3. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  4. C#中的Infinity有个小坑

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...

  5. 使用EMMET中的小坑

    使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...

  6. 关于CSS3中transform变换的小坑

    2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...

  7. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

  8. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  9. mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会

    <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...

随机推荐

  1. docker 仓库搭建

    阿里云服务器: 127.0.0.1(客户端) 127.0.0.2(私有服务器) 127.0.0.2作为私有仓库使用 1.下载镜像 [root@insure ~]# docker pull regist ...

  2. 【Codeforces Round 1117】Educational Round 60

    Codeforces Round 1117 这场比赛做了\(A\).\(B\).\(C\).\(D\).\(E\),\(div.2\)排名\(31\),加上\(div.1\)排名\(64\). 主要是 ...

  3. QT listwiget 控件添加图片

    很多的时候我们需要制作类似手机的中的电子相框, 可以用listwidget 控件实现 直接上代码 MainWindow::MainWindow(QWidget *parent) : QMainWind ...

  4. odoo之页面跳转

    击备注时,会由备注id带出他的内容 customer.requirement这是备注内容表 def sale_requirements_change(self, cr, uid, ids, requi ...

  5. 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute (转载)

    ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的,所以文章提到了cor ...

  6. cp 命令有坑

    cp 是个很常用的命令, 基本语法为  cp -v  a   b  把文件a 复制为文件b(-v为显示做了什么,这是非常安全的做法,建议新手添加此参数) 参数说明: -a:此选项通常在复制目录时使用, ...

  7. nginx location url解析过程

  8. Python从菜鸟到高手(1):初识Python

    1 Python简介 1.1 什么是Python   Python是一种面向对象的解释型计算机程序设计语言,由荷兰人吉多·范罗苏姆(Guido van Rossum)于1989年发明,第一个公开发行版 ...

  9. RabbitMQ 延时消息设计

    问题背景 所谓"延时消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一:客户A在十二点下了一个订单,我想半个小时后来 ...

  10. [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl

    UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...