当时年轻的我在做项目时遇到的坑2
关于models中Date数据类型与Datetime数据类型在前端的过滤
这篇博客总结的挺全:https://www.cnblogs.com/dylan-wu/p/7571493.html
将datetime与date类型的数据统一转换为str类型的类
import json from datetime import datetime from datetime import date #对含有日期格式数据的json数据进行转换 class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field,datetime): return field.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field,date): return field.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self,field) d1 = datetime.now() dd = json.dumps(d1,cls=JsonCustomEncoder) print(dd)
拓展Django自带的user表时报错
应用customer的models中UserInfo类是这样写的:
from django.db import models from django.contrib.auth.models import AbstractUser #CRM系统的用户表——拓展Django的user表 class UserInfo(AbstractUser): # null=True,blank=True~~写在一起,第一个是在数据库中约束的,第二个是在做认证的时候约束的 telephone = models.CharField(max_length=32,null=True,blank=True)
然后在全局文件的__init__.py文件中加上pymysql相关的代码:
import pymysql pymysql.install_as_MySQLdb()
但是我在运行数据库同步的命令时:
python3 manage.py makemigrations
遇到了下面的错误:
auth.User.groups: (fields.E304) Reverse accessor for ‘User.groups’ clashes with reverse accessor for ‘User.groups’. HINT: Add or change a related_name argument to the definition for ‘User.groups’ or ‘User.groups’. auth.User.user_permissions: (fields.E304) Reverse accessor for ‘User.user_permissions’ clashes with reverse accessor for ‘User.user_permissions’. HINT: Add or change a related_name argument to the definition for ‘User.user_permissions’ or ‘User.user_permissions’. users.User.groups: (fields.E304) Reverse accessor for ‘User.groups’ clashes with reverse accessor for ‘User.groups’. HINT: Add or change a related_name argument to the definition for ‘User.groups’ or ‘User.groups’. users.User.head_url: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command “pip install Pillow”. users.User.user_permissions: (fields.E304) Reverse accessor for ‘User.user_permissions’ clashes with reverse accessor for ‘User.user_permissions’. HINT: Add or change a related_name argument to the definition for ‘User.user_permissions’ or ‘User.user_permissions’.
错误的解决方案是:
需要在setting中重载AUTH_USER_MODEL
# 扩展Django的user表时需要重载AUTH_USER_MODEL AUTH_USER_MODEL = 'customer.UserInfo'
customer:我的应用的名称
UserInfo:model中拓展user的类
接下来再运行数据库同步命令就没问题了~
pyhton3 manage.py makemigrations
python3 manage.py migrate
Django中models.ManyToManyField添加null=True参数遇到的一个警告
在维护之前的CRM系统时遇到过这个问题,当时没怎么关注,现在再做别的系统的时候又遇到了,经过向大佬请教才明白原理。
我现在有两张表:客户表Customer与课程表ClassList,二者是多对多的关系,在Customer中建立关联字段:
class_list = models.ManyToManyField('ClassList',verbose_name='已报班级',null=True,blank=True)
注意我这里设置了null=True。然后在同步数据库的时候Pycharm给我上了一个Warring:
说明如下:
对于ManyToManyField来说,class_list这个字段其实只是一个操作第三张表的一个属性,ORM会自动生成第三张表去展示Customer表与ClassList表的关系,第三张表实际上不填数据也可以!因此给class_list设置null=true无效的,Django不会识别这个属性!
在外部文件中调用Django环境
# -*- coding:utf-8 -*- import os import random import string if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "whwCRM.settings") import django django.setup() from customer import models lst = [] for i in range(1,20): obj = models.Customer( qq=''.join(random.choices(string.digits,k=11)), name = ''.join(random.choices(string.ascii_letters+string.digits,k=5)), sex = random.choice(['male','female']), source=random.choice(['qq','referral','website']), course=random.choice(['LinuxL', 'PythonFullStack']), ) lst.append(obj) models.Customer.objects.bulk_create(lst)
时间格式越限的问题
在做项目测试过程中,在模板渲染的时候上报了这样的错误:
根据浏览器的提示发现是在模版渲染的过程中发上的错误~~
最后发现出现问题的原因是:手动往Django自带的Sqllit数据库插入数据的时候,对于Date及Datetime格式的数据,这个数据库会把日期格式的数据转译成int格式的数据,在模板渲染的过程中,这个数据超出了signed int的最大范围,所以会上报上面的错误~
暂时的解决方案是:
1、在models中定义这个字段的时候可以设置一下:null=True,blank=True~手动录入数据时可以不用输入这两个数据~~
2、或者可以利用程序往数据库中插入时间格式的数据~用程序插入的数据是时间格式的~在模版渲染的过程中不会出错。
至于原因:个人认为是数据库本身的问题~录入的时候数据不显示成日期格式的话确实还是很麻烦的~
Django的app注册时遇到的坑
一般情况下,如果我们不用应用中的apps.py文件的话,在settings中注册app可以直接写app的包的名字:
但是最近在做一个stark组件的demo的时候发现一个问题:实现“在路由分发前加载某些py文件”的功能的时候,如果按照上面的这种方式注册app的话程序并不会执行相应app中的py文件!
因此,正确注册app应用的方式应该是这样的:
所以,平时要养成习惯!按照标准的方法去注册app!!!
django时间与系统时间相差8小时问题
django的配置文件settings中,之前有两个全局变量:TIME_ZONE 与USE_TZ 把这两个值改一下:
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False -------------这句话,如果已经存在了,就需要把USE_TZ改成USE_TZ=False