django 模型高级用法

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

1 外键 高级用法

正常用法: b = Book.object.all() 拿到全部
拿到某个值 b = Book.object.get(id = 50)
那么拿到这个书的出版商: b.publisher 就可以 

那么反向通过出版商找书籍呢? easy
p = publisher.object.get(name = leisen media)
p.book_set.all 就能拿到这个出版商出的书
你可以对其进行分割  p.book_ser.filter(price__gt=100)
p.book_set.filter(name__icontains='django')  

2 多对多的用法和外键一样

[3 模型自定义函数,可以把一些常用的查询写成函数][1]

class BookManager(models.Manager):
def title_count(self, keyword):
return self.filter(title__icontains=keyword).count()

django 查询过滤的问题

这种形式能完成查询一个属性有多个值的情况

User.objects.filter(username__in=['user1','user2'])

同样这个也可以

groups = Group.objects.filter(player=p1).filter(player=p2)

如果你要查询一个更复杂的情况

filter_dict = disc()
把相关值打包放进去

User.objects.filter(**filter_disc)

#我查到另外一个但是不行!

class AppRightManageListView(ListView): template_name = ‘rightmanage/list_apprightmanage.html’ # model = DeployPool paginate_by = 50

def get_queryset(self):
    filter_dict = dict()
    if self.request.GET.get('search_pk'):
        filter_dict['name__contains'] = self.request.GET.get('search_pk')
    if self.request.GET.get('app_name'):
        filter_dict['id'] = self.request.GET.get('app_name')
    if self.request.GET.get('site_name'):
        app_id_list = []
        site = Site.objects.get(id=self.request.GET.get('site_name'))
        for app in site.app_name.all():
            app_id_list.append(app.id)
        filter_dict['id__in'] = app_id_list
    return App.objects.filter(**filter_dict)

记Django 的一个大坑,账户密码明明是对的,但是无法登录

记Django 的一个大坑,账户密码明明是对的,但是无法登录

在创建超级用户的时候

python manager.py createsuperuser 

你如果创建用户成功了,但是你的密码和用户名比较像,他是不会提醒你的!,但是你如果想登录,他总是说你密码错误,我在这里卡了2天,硬是找不到原因,最终我使用

python manger.py changepassword username

来修改密码但时候,他就说我新密码和用户名太像不行!吗的为什么不在创建时候提醒我!

安装xadmin for Django 2 的时候慢的处理方法

在尝试安装xadmin for Django2 的时候,pip install [email protected] 命令非常慢!不知道怎么办,翻墙太麻烦 后来通过国内的 gitee 中转解决了。。 注意必须用 https 来安装。。

pip install git+https://gitee.com/woooms/django-xadmin-2

还有在配置uwsgi 配置文件的时候老是忘记查看虚拟环境路径的命令

echo $VIRTUAL_ENV

Django 部署笔记—— Nginx + Github + Uwsgi + Supervisor

部署Django不是一个简单的事情,我遇到相当多的麻烦

第一步,部署前的准备

来到Django项目的根目录,别忘记Django 部署之前是需要收集静态文件的,收集静态文件有很多坑。STATIC_ROOTSTATIC_URL是必须指定的

STATIC_ROOT = os.path.join(BASE_DIR, 'static') #上面的意思是把路径里面带static的文件都放在static这个静态文件夹里面.. 

STATIC_URL = '/static/' 

 STATICFILES_DIRS = [ # os.path.join(BASE_DIR, "others"),] 
 # 要注意的是!如果上面的STATIC_ROOT 已经指定的任何路径,在这里都不要再指定,这里是给你加其他静态文件的,比如url特征是别的单词

在github或者gitee 上新建一个项目,拿到项目仓库地址,https://gitee.com/projectname/master

来到你的项目根目录 git init初始化你的项目; 然后 git remote add name https://gitee.com/projectname/master 把你的项目和远程仓库绑定 然后 git add -A把文件加到暂存区,git commit -m '第一次提交' 最后,提交代码 git push name master

** 注意有时,你无法提交,因为仓库里面默认有一个文件,你先 git pull name master一下,再push!

在你的服务器安装新的虚拟环境,mkvirtualenv name 安装你需要的任何包,千万不要忘记几个重要的包,虽然项目没说需要,但是没有却报错, dev-python3 这个!

pip install uwsgi 后,你先用 uwsgi 命令测试下能不能跑起来,后面的参数意思分别是 虚拟环境目录,wsgi.py 文件路径,还有一个权限配置。

uwsgi --home /root/.virtualenvs/djshop --file MxShop/wsgi.py --chmod-socket=666 

如果你上一步没问题,说明你代码没问题,

然后你就需要写 uwsgi.ini 这个配置文件了,我给你一个样本,写好了放项目根目录

chdir     =  /path/to/project/ #项目的根目录,绝对路径
wsgi-file = Name/wsgi.py # django 下面 wsgi 路径
processes = 1  # number of cores on machine
max-requests = 5000
chmod-socket = 666
master = True
vacuum = True
socket = /srv/xxx/name.sock # 和nginx 通信的脚本位置,你在这里写的什么路径,等下在nginx 配置文件要写一样的
daemonize = /srv/xxx/log/uwsgi.log # 日志的位置

然后 uwsgi –ini uwsgi.ini 来测试下配置文件,一般没问题。

写Nginx 配置:

cd /ect/nginx/conf.d/ 下面新建一个 name.conf 文件,作为你新网站的配置文件。 最好每个网站给一个配置文件。

server {
# 监听的端口号
    listen 80;
    # 域名或者本机的ip地址
    server_name www.domain.com ;
    charset     utf-8;
    # 最大的上传大小
    client_max_body_size 75M;
    # adjust to taste

    # 访问根目录下的任何url的配置
    location / {
    # 指定访问哪个upstream
    uwsgi_pass xxx;
    # 包括uwsgi参数的文件
    include     /etc/nginx/uwsgi_params;
}
    location /static {
    alias /srv/xxx/static;
}

}

基本这样就好,nginx 和 uwsgi 就连起来来,nginx 是入口,静态文件自己处理了,其他文件就分给wusgi 处理

当然你需要使用 supervisor 来管理你的uwsgi 进程也可以,我就不细说了。