一对多的添加操作
class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) pubDate=models.DateField() price=models.DecimalField(max_digits=6,decimal_places=2) publisher=models.ForeignKey(to="Publish")
再建立一个Publish表,也即是出版社表:
class Publish(models.Model):
    name=models.CharField(max_length=32)
    addr=models.CharField(max_length=32)
    tel=models.BigIntegerField()
从上面两张表中我们可以看出,书对应的‘多’的哪一方,出版社对应的是‘一’的那一方。讲两张表关联起来,可以运用代码publisher=models.ForeignKey(to="Publish"),此时在book表中会出现字段publisher_id字段,其中_id为pycharm默认补充的。
现在来写如何向一对多表中添加数据,如下:
def add(request):
    if request.method=="POST":
        titles = request.POST.get("title")
        pubdate = request.POST.get("pubdate")
        price = request.POST.get("price")
        publish_id = request.POST.get("pub")
        # 一对多 添加数据 方式1
        # publish_obj=models.Publish.objects.get(name="renmin")
        # book_obj=models.Book.objects.create(title="python",price=122,pubDate="2012-12-12",publisher=publish_obj)
        # 一对多 添加数据 方式2
        book_obj=models.Book.objects.create(title=titles,price=price,pubDate=pubdate,publisher_id=publish_id)
        print(book_obj.title)
        # obj=models.Book(title="python",price=122,pubDate="2012-12-12",publisher=publish_obj)
        # obj.save()
        return redirect("/index/")
多对多的添加操作
class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    tel=models.CharField(max_length=32)
    def __str__(self):
        self.name+‘ ‘+str(self.age)
在建好了第三张表之后,我们需要在Book表中添加关联字段如下:
class Book(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    pubDate=models.DateField()
    price=models.DecimalField(max_digits=6,decimal_places=2)
    publisher=models.ForeignKey(to="Publish")
    #书籍与作者:多对多
    authors=models.ManyToManyField(‘Author‘)
此时在sqlite中将会出现第三张虚拟表,其中虚拟表中存放的是author_id和book_id,这即是所需要的多对多的关系,通常情况下,不可以手动添加,往第三张表中添加关联关系的数据代码如下:
        book_obj=models.Book.objects.create(title=titles,price=price,pubDate=pubdate,publisher_id=publish_id)
        print(book_obj.authors.all())
        alex=models.Author.objects.get(name=‘alex‘)
        egon=models.Author.objects.get(name=‘egon‘)
        book_obj.authors.add(alex,egon)
此时我们可以将egon和alex添加到数据库新建立的关系字段中,在虚拟表authors_book表中,我们可以看到生成了如下结果:

至此,多对多的数据添加操作完成。
基于对象的正向查询和反向查询
def query(request): #一对多的正向查询 # book_obj=models.Book.objects.get(title=‘python‘) # author_list=book_obj.authors.all() # for author_obj in author_list: # print(author_obj.age)
正向查询时,我们需要查询的是一本书对应的所有作者信息,此时我们首先需要从Book表中获得python那本书的书籍对象,之后利用这本书籍对象获得所有的作者列表,循环作者列表,查询所需要的信息。
反向查询:
def query(request):
    pub_obj=models.Publish.objects.get(name=‘机械出版社‘)
    book_list=pub_obj.book_set.all()
    for obj in book_list:
        print(obj.title)
在反向查询时,我们的目的是要获得机械出版社出版的所有图书信息,首先我们需要获得出版社对象,之后利用出版社对象获得图书的列表,在这里注意的是在获取图书列表时我们需要取得对象是book_set而不是book对象,最后再循环书籍对象,即可以获得我们所需要的信息。
多对多反向查询
def query(request):
                alex=models.Author.objects.get(name=‘alex‘)
                book_list=alex.book_set.all()
                for obj in book_list:
                print(obj.title,obj.price)
这里用的多对多的对象是书籍和作者,首先需要从Author表中获得作者对象,之后利用作者对象从book_set中取出所有的书籍列表,遍历书籍列表中的每一本图书,打印出所需要的图书信息。
一对一查询
def query(request): #一对一的查询:正向查询,按照字段 # autor_detail=models.AuthorDetail.objects.get(addr=‘shahe‘) # print(autor_detail.author.name) return HttpResponse(‘OK‘)
我们首先建立两张一对一的关联表,在正向查询中,我们需要获得的是地址在shahe的作者,首先我们从AuthorDetail表中获得作者对象,之后利用作者对象从autor表中获得所需要的信息
反向查询:在反向查询的时候,查询的核心是按照表名来进行查询
def query(request):
    #一对一查询:反向查询,按照表名
    alex=models.Author.objects.get(name=‘alex‘)
    print(alex.authordetail.addr)
    return HttpResponse(‘OK‘)