`
喜欢蓝色的我
  • 浏览: 360090 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

django Django--Model中的ManyToManyField及页面显示

 
阅读更多

多对多的模式:

1. 新建项目

命令:django-admin.py startproject csvt06

2.建app

命令:python manage.py startapp blog

3.修改seting.py

数据库选择sqlite3

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.

        'NAME': 'csvt',                      # Or path to database file if using sqlite3.

        'USER': '',                      # Not used with sqlite3.

        'PASSWORD': '',                  # Not used with sqlite3.

        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.

        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.

    }

}

app打开admin 、添加blog

INSTALLED_APPS = (

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.sites',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    # Uncomment the next line to enable the admin:

     'django.contrib.admin',

    # Uncomment the next line to enable admin documentation:

    # 'django.contrib.admindocs',

'blog',

)

4.在blog下编辑models.py

from django.db import models

 

# Create your models here.

class Author(models.Model):

name = models.CharField(max_length =30)

 

def __unicode__(self):

return self.name

 

class Book(models.Model):

name = models.CharField(max_length =30)

authors = models.ManyToManyField(Author)         #创建多对多的关系

 

def __unicode__(self):

return self.name

5.在命令行执行命令:python manage.py syncdb

 

表 blog_book_authors 中存放着表blog_book 和表blog_author的关联关系

用户名:km 密码:123456

6.运行交换shell命令:ipython manage.py shell

在交换窗口输入下面值,blog_author表中创建四个数据

from blog.models import Author ,Book

Author.objects.crea

Author.objects.create(name='Alen')

Author.objects.create(name='Ben')

Author.objects.create(name='Carl')

Author.objects.create(name='Dev')

authors = Author.objects.all()

authors

返回四个author的name

bl = Book()

b1.name = 'python book1'

b1.save()

取出Author中的Alen赋值给alen ‘name__exact’相当于sql 中的like

alen = Author.objects.get(name__exact = 'Alen')

alen

添加对应关系表

b1.authors.add(alen)

b1.authors.add(authors[1])

b1.authors.add(authors[2])

b1.authors.add(authors[3])

b1.author.all

删除对应关系表中的authors中的alen元素

b1.authors.remove(alen)

bl.authors.filter(name__exact='Carl')

 查看alen属性

alen.book_set.all()

添加对应关系,把alen和b1添加关联

alen.book_set.add(b1)

alen.book_set.all()

alen.book_set.create(name = 'python book2')

alen.book_set.all()

 

 

显示[<Book: python book1>,<Book:python book2>]

 

删除book中的第一个书

alen.book_set.remove(books[0])

shell中循环显示作者和他的书

for author in Author.objects.all():

    for book in author.book_set.all():

        print book

python book1

python book2

python book1

python book1

python book1

 

 

from blog.mobels import Author

alen = Author.objects.filter(name='Alen')

alen

通过shell添加一本书

alen.book_set.create(name='web1 book');

from blog.models import Book

books = Book.objects.all()

books

books[0]

b1 = books[0]

 

bl.authors.all()

7.在blog中添加views.py

# Create your views here.

from blog.models import Author,Book

from django.shortcuts import render_to_response

 

def show_author(req):

authors = Author.objects.all()

return render_to_response('show_author.html',{'authors':authors})

 

 

def show_book(req):

books = Book.objects.all()

 

return render_to_response('show_book.html',{'books':books})

8.在项目中添加url.py

from django.conf.urls.defaults import patterns, include, url

 

# Uncomment the next two lines to enable the admin:

# from django.contrib import admin

# admin.autodiscover()

 

urlpatterns = patterns('',

    # Examples:

    # url(r'^$', 'temp.views.home', name='home'),

    # url(r'^temp/', include('temp.foo.urls')),

 

    # Uncomment the admin/doc line below to enable admin documentation:

    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

 

    # Uncomment the next line to enable the admin:

    # url(r'^admin/', include(admin.site.urls)),

url(r'^blog/show_author/$','blog.views.show_author'),

url(r'^blog/show_book/$','blog.views.show_book'),

)

9.在blog下建文件夹templates,新建模板文件show_author.html 和show_book.html

show_author.html-----循环显示每个作者的书

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

 <head>

  <title> New Document </title>

  <meta name="Generator" content="EditPlus">

  <meta name="Author" content="">

  <meta name="Keywords" content="">

  <meta name="Description" content="">

 </head>

 

 <body>

  {% for author in authors%}

  <h3>{{author.name}}</h3>

      {% for book in author.book_set.all%}

 <li>{{book}}</li>

   

      {%endfor%}

  {%endfor%}

 </body>

</html>

show_book.html----循环每本书的作者

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

 <head>

  <title> New Document </title>

  <meta name="Generator" content="EditPlus">

  <meta name="Author" content="">

  <meta name="Keywords" content="">

  <meta name="Description" content="">

 </head>

 

 <body>

  {% for book in books%}

      <div>

     <h1>{{book.name}}</h1>

 {% for author in book.authors.all%}

     <li>{{author}}</li>

 {%endfor%}

 

 </div>

  {%endfor%}

 </body>

 

</html>

10.命令行运行自动服务器

命令:python manage.py runserver

访问地址:http://127.0.0.1:8000/blog/show_book/

http://127.0.0.1:8000/blog/show_author/

完成

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    django-tracking-fields:允许在管理站点中跟踪对象字段的Django应用

    允许在管理站点中跟踪对象字段的Django应用。 要求 Django 2.2:有关Django早期版本的信息,请参见旧版本。 django-cuser:仅当您要跟踪哪个用户进行了修改时。 快速开始 将“ tracking_fields”添加到您的...

    在Django admin中编辑ManyToManyField的实现方法

    关系数据库中有一种多对多的关系,在Django的ORM中也支持它,使用ManyToManyField. 下面使用EmailGroup和Email来展示如何使用 class EmailTo(models.Model): name = models.CharField(max_length=64) email = ...

    Django 多表关联 存储 使用方法详解 ManyToManyField save

    当models中使用ManyToManyField进行多表关联的时候,需要使用字段的add()方法来增加关联关系的一条记录,让两个实例关联起来才能顺利保存关联关系 #models.py 问题分类question_category和类别使用了多对多关系(先...

    通过数据库对Django进行删除字段和删除模型的操作

    从Model中删除一个字段要比添加容易得多。 删除字段,仅仅只要以下几个步骤: 删除字段,然后重新启动你的web服务器。 用以下命令从数据库中删除字段: ALTER TABLE books_book DROP COLUMN num_pages; 请保证...

    Django ManyToManyField 跨越中间表查询的方法

    1、在 django 表中用到了 manytomany 生成了中间表 pyclub_article_column from django.db import models # Create your models here. class Column(models.Model): id = models.AutoField(u'序号',primary_key=...

    Django model反向关联名称的方法

    如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称。但在抽象基类上这样做就会引发一个很严重的问题。因为 Django 会将基类字段添加到每个子类当中,而...

    简单了解django orm中介模型

    中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就不存在中介模型 中介模型示例 普通的ManyToMany示例 class Book(models.Model): title = models....

    Django ORM多对多查询方法(自定义第三张表&ManyToManyField)

    – 2.ManyToManyField 自动生成第3张表 只能 有3列数据 不能自己添加。 自定义第三张表 # models.py class Boy(models.Model): name = models.CharField(max_length=32) class Girl(models.Model): name = models...

    使用Django Form解决表单数据无法动态刷新的两种方法

    1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为“多对多” from django.db import models class Classes(models.Model): title = models.CharField(max_length=32) class Teacher(models.Model): ...

    django创建多对多表三种方法,和ORM操作增删改查

    django会帮你在数据库自动生成一个老师和班级的关系表,但不显示在models.py里面,所以不能直接操作关系表,但是可以间接操作。 不足之处:关系表只能有三个字段,比如我想在关系表中添加一个上课时间的字段,那么就...

    django 多对多表的创建和插入代码实现

    这篇文章主要介绍了django-多对多表的创建和插入代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... # 第一种方式直接在作者表中创建ManyToManyField字段(ORM会自动帮我们创建第

    django多对多表的创建,级联删除及手动创建第三张表

    class Author(models.Model): name = models.CharField(max_length=32) #在Author表中创建第三张表,与book表创建多对多关系一样的效果 # books = models.ManyToManyField(Book) #再重新生成数据库,因为新增了多...

    django基于restframework的CBV封装详解

    from django.db import models # Create your models here. class Book(models.Model): title=models.CharField(max_length=32) price=models.IntegerField() pub_date=models.DateField() publish=models....

Global site tag (gtag.js) - Google Analytics