django基础 --- 模型(连表操作)

2016-12-12  本文已影响0人  梦想做小猿

models.py继续上一篇

from django.db import models

#出版社信息表
class Publisher(models.Model):
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)

    def __unicode__(self):
        return self.name

#作者表
class Auther(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()

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

#书籍表
class Books(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Auther)
    publisher = models.ForeignKey(Publisher)

    def __unicode__(self):
        return self.title

一对多 --- 增(ForeignKey)

1.先添加出版社和作者数据

单表添加数据见上一篇文章

书籍表中书籍和出版社是一对多关系,一本书只有一个出版社,一个出版社有多本书

2.添加书籍
添加书籍前,先把出版社查找出来,然后创建对应关系

p = Publisher.objects.get(name="Apress")
Books.objects.create(title="python django",publisher=p)

这里将出版社和书籍创建了关联

多对多 --- 增(manytomany)

书籍和作者间是多对多关系,一本书有多个作者,一个作者有多本书,创建书籍对应关系前,先查找作者,然后添加到书籍作者中

u1 = Auther.objects.get(name="jack")
u2 = Auther.objects.get(name="jones")
b = Books.objects.get(title="python django")
b.authors.add(u1)
b.authors.add(u2)

这里为书籍添加了2个作者

一对多 --- 查

获取某书籍的出版社:

Books.objects.get(title="python django").publisher

获取某出版社的书籍(反查):

Publisher.objects.get(name="Apress").books_set.all()
#或
Books.objects.get(publisher__name="Apress")

多对多 --- 查

获取某书籍的所有作者

Books.objects.get(title="python django").authors.all()

获取书籍的作者名为jack的作者

Books.objects.get(title="python django").authors.filter(name="jack)

查询一个作者的所有书籍(反查)

Auther.objects.get(name="jack").books_set.all()
#或
Books.objects.get(auther__name="jack")

注:在一对多和多对多中,正向查询都是先查询某一个值,然后根据该值得外键去查询对应数据,反向查询先查询需要查询的数据然后使用表名+_set反向关联

上一篇下一篇

猜你喜欢

热点阅读