撰写时间:2017.6.15晚
系统环境:ubuntu14.04,django1.11,python2.7
首先安利一波django,确实是很好用的套件,其中关于数据库的操作让我有点佩服,基本我想要的他都能找到API,给人一种恰到好处的感觉!但是寻找API的过程是比较痛苦的,还有就是作为新手,对django不熟,是很痛苦的经历.而且在学习django的过程中一定要知其然,而且知其所以然,才能熟练使用他,而我只是课程作业用一次,我以后应该用的比较少.遇到的问题记录一下,权当笔记.
版本 django1.11,不同版本就不要看了!
下面的博客内容有很多主观臆测的东西…因为我压根就没有仔细读他的文档…
还有这篇文档不是交你怎么做django的,只是我遇到的问题的集合,如果你恰好和我版本一样,而且也遇到了这个问题,就可以参看一下!
首先描述我的项目,不然下面的问题也无从讲解
本项目是一个django实现的论文数据库管理系统,论文数据来自与dblp,从中拆剪了60M的文件,总计数据有13w条数据,然后通过漫长的数据分析.生成了四个表:article,author,journal,article_author,
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db import connection,transaction
class articleManager(models.Manager):
#select
# def select_by_article_title(self,articleTitle):
# return super(articleManager, self).get_queryset()
def select_by_journal_id(self,journalID):
#return super(articleManager, self).get_queryset().filter(journal_id__in = journalID)
return super(articleManager, self).get_queryset().filter(
journal_id__in = journalID).select_related('journal').prefetch_related('author_set')
#sql = """select * from papermodel_article where article_id=1"""
#return super(articleManager, self).raw(sql);
#create tables.
class article(models.Model):
article_id = models.AutoField(primary_key=True,auto_created=True)
article_title = models.CharField(max_length = 1024);
article_year = models.IntegerField();
article_volume = models.IntegerField();
journal = models.ForeignKey('journal')
url = models.CharField(max_length=81,null=True)
object = articleManager()
def __unicode__(self):
return u'{} {}'.format(self.article_title,self.article_year)
class authorManager(models.Manager):
#select
def select_by_author_name(self,authorName):
return super(authorManager,self).get_queryset().filter(author_name__contains='Juha')
class author(models.Model):
author_id = models.AutoField(primary_key=True,auto_created=True)
author_name = models.CharField(max_length = 81);
article = models.ManyToManyField(article,through='article_author',through_fields=(
'author','article'));
object = authorManager()
#display
def __unicode__(self):
return u'{} {}'.format(self.author_id,self.author_name)
class Meta:
ordering = ['author_id']
class journalManager(models.Manager):
#select
def select_by_journal_name(self,journalName):
return super(journalManager,self).get_queryset().filter(journal_name__contains='ab')
class journal(models.Model):
journal_id = models.AutoField(primary_key=True,auto_created=True)
journal_name = models.CharField(max_length = 81);
object = journalManager()
#display
def __unicode__(self):
return self.journal_name
class article_author(models.Model):
article_author_id = models.AutoField(primary_key=True,auto_created=True)
article = models.ForeignKey(article)
author = models.ForeignKey(author)
serial_number = models.IntegerField();
#display
def __unicode__(self):
return u'{} {} {}'.format(self.article_id,self.author_id,self.serial_number)
其中包括外键,以及多对多的关系,在查询的过程中就得花心思!
因为下面要实现的功能,与查询息息相关
恩,就是这个丑东西,主要是锻炼数据库sql查询,所以界面我也是才学啊…
搜索框旁边的all是搜索选项,可以选择按照author,article,year,journal等词条搜索,all就是随意…
不管什么搜索,都要显示下面是三个内容.主要是article内容端要包含journal和author的信息,所以这地方的查询对新手来说比较绕.
下面就是我实际在开发中遇到的问题.
在强调一遍,我用的版本是1.11,版本不一样,肯定api有差别的!!
https://www.douban.com/note/301166150/
https://www.douban.com/group/topic/27653472/
问题答案参考网址,django1.11文档static设置
此配置仅适合于调试阶段,也就是使用django的runserver在django内部的服务器中运行,不涉及tomcat等外部服务器
###setting.py
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
STATIC_URL = '/static/'
###html
{% load static %}
<img src="{% static "picture/logo.png" %}" alt = "logo"/>
###url
from django.contrib.staticfiles import views
urlpatterns = [
url(r'^static/(?P<path>.*)',views.serve),
]
class journal(models.Model):
pass
class article(models.Model):
journal = models.ForeignKey(journal,related_name="article")
class author(models.Model):
article = models.ManyToManyField(article,through='article_author',through_fields=(
'author','article'),related_name="author");
class article_author(models.Model):
article_author_id = models.AutoField(primary_key=True,auto_created=True)
article = models.ForeignKey(article)
author = models.ForeignKey(author)
serial_number = models.IntegerField();
四张表,其中最后一张表是中间表,因为有第三个字段,所以就需要重新建一个中间表.在外键和多对多关系的建立中,最好都添加一个related_name字段.比如journal和article之间有一个外键连接.其中外键设置在article类中,如果不设置related_name,那么当journal表需要通过外键反查article表时,命名就为article_set,如果设置了related_name,这里就会覆盖article_set的命名.关于如何通过外键反查,请看下面.
django1.11 直接使用migrate管理工具,先修改django model层对应的字段,然后运行下面命令
python manage.py makemigrations
python manage.py migrate
这个问题分成两个小问题
1.如何通过外键查询信息
2.如何通过中间表查询信息
https://stackoverflow.com/questions/12139923/all-the-values-of-the-many-to-many-field-django
https://stackoverflow.com/questions/11073454/django-prefetch-related-with-filter
贴上我的文件目录,mvc架构一目了然,其中static目录是用来存放外部文件的
最后安利一波django自动生成的后台管理系统!!!
因为外键约束在增加article的时候,会弹出增加journal的弹出框,不能再赞!!!
关于这个如何将自己的model导入他自动生成的管理界面.可以参考菜鸟教程