第一次使用django开发网页遇到的问题

撰写时间: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/

问题1:在django中的html引入外部文件,例如css,js,img等外部文件

问题答案参考网址,django1.11文档static设置
此配置仅适合于调试阶段,也就是使用django的runserver在django内部的服务器中运行,不涉及tomcat等外部服务器

  1. 确保配置文件中(setting.py)INSTALLED_APPS中包含django.contrib.staticfiles
  2. 在配置文件中(setting.py)中,添加STATIC_URL = ‘/static/’,其中/表示的就是根目录,如下图所示的我的文件目录表,服务器中是将外层paperManager作为/目录的,所以如果你的static不在图示的位置,只要将这个地址改一下就行了.
  3. 在html中引入外部文件(编辑器太…说不定是我不会用,看下面附件吧)
  4. 配置url,
  5. 在setting.py中添加STATICFILES_DIRS字段
###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),
]

问题2:django中与数据库相关的model层怎么建?包括onevsmany和manyvsmany


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的命名.关于如何通过外键反查,请看下面.

问题3:如果数据库的列发生变化,或者想增加数据库之类的怎么通过django model层实现?

django1.11 直接使用migrate管理工具,先修改django model层对应的字段,然后运行下面命令

python manage.py makemigrations
python manage.py migrate

问题4:如何通过article反查author的信息.

这个问题分成两个小问题
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

问题5:如何修改

贴上我的文件目录,mvc架构一目了然,其中static目录是用来存放外部文件的

这里写图片描述

最后安利一波django自动生成的后台管理系统!!!

这里写图片描述

因为外键约束在增加article的时候,会弹出增加journal的弹出框,不能再赞!!!

这里写图片描述

关于这个如何将自己的model导入他自动生成的管理界面.可以参考菜鸟教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值