当时年轻的我在做项目时遇到的坑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

 

posted on 2019-06-12 15:37  江湖乄夜雨  阅读(495)  评论(0编辑  收藏  举报