Day-Day-Up

Django中一对多外键使用方法

2017-12-08  本文已影响0人  az1981cn

 1.定义数据模型

以出版社、作家、作家信息、书籍四个对象模型为例:

(1)一本书籍只能有一个出版社,此为一对多关系(ForeignKey),主表为出版社,子表为书籍;

(2)一本书可以有多个作者,一个作者可以出多本书,此为多对多关系(ManyToManyField)

(3)作家和作家信息之间是一对一关系,即Author对象和AuthorProfile对象是一一对应的。

from django.db import models

        class Publisher(models.Model):

        name = models.CharField(max_length=30)

        address = models.CharField(max_length=50)

        def __unicode__(self):

                return self.name

class Author(models.Model):

        name = models.CharField("姓名",max_length=30)

        age = models.IntegerField("年龄")

        def __unicode__(self):

                return u'%s' % (self.name)

class AuthorProfile(models.Model):

        # 以下定义一对一关系,即Author对象和AuthorProfile对象是一对一关系

        user = models.OneToOneField(Author, unique=True)

        phone = models.CharField("电话",max_length=20)

        email = models.EmailField("邮箱")

        def __unicode__(self):

                return 'user{}'.format(self.user.name)

class Book(models.Model):

        title = models.CharField(max_length=100)

        # 以下定义多对多关系,Author对象和Book对象是多对多关系

        authors = models.ManyToManyField(Author)

        # 以下定义一对多关系,主表是Publisher,子表是Book,Pulisher对象和Book对象是一对多关系

        publisher = models.ForeignKey(Publisher, related_name="b_set")

        publication_date = models.DateField()

        def __unicode__(self):

                return self.title

注意事项:

(1)OneToOneField,ForeignKey,ManyToManyField都是在子表中声明的;

(2)可以声明related_name作为主表对象访问从表数据的一种方式(以下详述)。

 2.ForeignKey数据访问方式

(1)查找[某出版社]出版的所有书籍【通过主表对象查询从表数据】

# 获取[某出版社]对象

publisher=Publisher.objects.all().filter("筛选某出版社的条件")

#通过[某出版社]主表对象获取所有书籍对象

books = publisher.book_set.all()

注意: django默认每个主表的对象都有一个对应外键的属性,可以通过它来查询属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续根据情况来查询等操作。

有时这么查询会比较麻烦,此时可以在定义主表的外键的时候设定好related_name,用related_name来查询。

# 获取[某出版社]对象

publisher=Publisher.objectsall().filter("筛选某出版社的条件")

#通过[某出版社]主表对象获取所有书籍对象

books = publisher.b_set.all()

(2)查找[某书籍]的出版社【通过从表对象查询主表数据】

假如先得到了一个子表的对象,那只要获取该对象关联主表的外键的属性,就可以得到主表的信息了。

# 获取[某书籍]对象

book=Book.objects.all().filter("筛选某书籍的条件")

#通过[书籍]从表对象获取出版社对象

publisher = book.publisher

上一篇 下一篇

猜你喜欢

热点阅读