码迷,mamicode.com
首页 > 其他好文 > 详细

Django, one-to-many, many-to-many

时间:2018-08-01 19:43:14      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:访问   RKE   对象   tom   res   count   存储   state   mos   

1、定义关系

  • 定义三个表,Publisher,Book,Author

  • 一个作者有姓,有名及email地址。
  • 出版商有名称,地址,所在城市、省,国家,网站。

  • 书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])

2、定义model

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()

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

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

3、基本数据库访问

  当你使用Django modle API创建对象时Django并未将对象保存至数据库内,除非你调用save() 方法

>>> from books.models import Publisher
>>> p1 = Publisher(name=‘Apress‘, address=‘2855 Telegraph Avenue‘,
...     city=‘Berkeley‘, state_province=‘CA‘, country=‘U.S.A.‘,
...     website=‘http://www.apress.com/‘)
>>> p1.save()
>>> p2 = Publisher(name="O‘Reilly", address=‘10 Fawcett St.‘,
...     city=‘Cambridge‘, state_province=‘MA‘, country=‘U.S.A.‘,
...     website=‘http://www.oreilly.com/‘)
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[, ]

  如果需要一步完成对象的创建与存储至数据库,就使用objects.create() 方法

>>> p1 = Publisher.objects.create(name=‘Apress‘,
...     address=‘2855 Telegraph Avenue‘,
...     city=‘Berkeley‘, state_province=‘CA‘, country=‘U.S.A.‘,
...     website=‘http://www.apress.com/‘)
>>> p2 = Publisher.objects.create(name="O‘Reilly",
...     address=‘10 Fawcett St.‘, city=‘Cambridge‘,
...     state_province=‘MA‘, country=‘U.S.A.‘,
...     website=‘http://www.oreilly.com/‘)
>>> publisher_list = Publisher.objects.all()
>>> publisher_list

  数据过滤

>>> Publisher.objects.filter(name=‘Apress‘)
[<Publisher: Apress>]
>>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
>>> Publisher.objects.filter(name__contains="press")
[<Publisher: Apress>]

  contains部分会被Django翻译成LIKE语句

 

  获取单个对象

>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>

  排序

>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O‘Reilly>]

  访问外键

>>> b = Book.objects.get(id=50)
>>> b.publisher

>>> b.publisher.website
u‘http://www.apress.com/‘

  访问多对多

>>> b = Book.objects.get(id=50)
>>> b.authors.all()
[<Author: Adrian Holovaty>, <Author: Jacob Kaplan-Moss>]
>>> b.authors.filter(first_name=‘Adrian‘)
[<Author: Adrian Holovaty>]
>>> b.authors.filter(first_name=‘Adam‘)
[]

  反向查询也可以。 要查看一个作者的所有书籍,使用author.book_set

>>> a = Author.objects.get(first_name=‘Adrian‘, last_name=‘Holovaty‘)
>>> a.book_set.all()
[<Book: The Django Book>, <Book: Adrian‘s Other Book>]

Django, one-to-many, many-to-many

标签:访问   RKE   对象   tom   res   count   存储   state   mos   

原文地址:https://www.cnblogs.com/gange111/p/9403409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!