django--orm關系字段(ForeignKey、OneToOneField、ManyToManyField)詳解


django中的關系字段

1、ForeignKey字段,即外鍵字段,對應一對多的情況,列如:一本書對應一個出版社,一個出版社可對應多本書。
2、ManyToManyFiled字段,即多對多字段,對應數據庫中一個數據相互可以對應多條,列如:一本書可以有多個作者,一個作者可以有多本書
3、OneToOneFiled字段,即一對一字段,通過用來將一條數據補常用的數據單獨存放,例如對於作者來說,姓名、作品等是常被查詢的,而地址、生日這些是補常用的,就可以將這部分數據通過一對一字段對應分表存放

准備工作:

from django.db import models

# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=12)
    addr = models.TextField()
    date = models.DateField()

class Book(models.Model):
    title = models.CharField(max_length=12)
    price = models.DecimalField(max_digits=6,decimal_places=2)
    isbn = models.CharField(max_length=20,unique=True)
    pulisher = models.ForeignKey(to='Publisher')

class Author(models.Model):
    name = models.CharField(max_length=12)
    gender=models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)

    phone=models.CharField(max_length=11,unique=True)
    email=models.EmailField()
    book = models.ManyToManyField(to='Book',related_name='authors')
    info = models.OneToOneField(to='Authorinfo',related_name='infos')

class Authorinfo(models.Model):
    birthday=models.DateTimeField()
    city=models.CharField(max_length=12)
    is_marry=models.BooleanField()
    income = models.BigIntegerField()

ForeiKeyField

2、運行django命令:python manage.py makemigrations 和 python manage.py migrate
3、在數據庫中添加數據:
作者表:

作者信息表:

查詢數據的方式:

查詢數據方法主要分為兩種方式:通過對象查詢和通過qureset數據查詢,其中每種方式還對應正向查詢和反向查詢,解釋:例如在上面兩個表中,一對一字段在作者表中那么根據作者表查信息表就是正向查詢,反之為反向查詢

ForeiKeyField正向查詢

通過對象正向查詢

例如查詢id=1的作者的詳細信息:
步驟:
1、獲取id=1的作者對象
2、通過一對一字段獲取對象
3、調用字段屬性
在django腳本中:

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models
    #獲取id =1 的數據對象
    obj  = models.Author.objects.get(id=1)
    #通過.一對一字段名的方式獲取信息表對象並查看屬性
    print(obj.info.country,obj.info.city)

運行結果:

英國 倫敦

通過對象反向查詢

查詢國家=英國 城市=倫敦的的作者
步驟:
1、獲取滿足條件的作者信息表對象
2、通過.表名方法獲取對象(當一對一字段有related_name參數時,用該參數的值替代表名_set)

from django.db import models

# Create your models here.


class Author(models.Model):
    #姓名字段
    name = models.CharField(max_length=12)
    #性別字段,choices參數對應選擇1、2、3
    gender = models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
    #一對一字段,related_name參數為反向查找時的別名。沒有別名反向查找時用
    info = models.OneToOneField(to='Authorinfo',related_name='infos')

class Authorinfo(models.Model):
    #年齡字段
    age = models.SmallIntegerField()
    #國籍
    country = models.CharField(max_length=12)
    #城市
    city = models.CharField(max_length=12)

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models

    #獲取信息表對象
    obj = models.Authorinfo.objects.get(country='英國',city='倫敦')
    #通過related_name='infos'反向查詢
    print(obj.infos.get_gender_display())

如果 info = models.OneToOneField(to='Authorinfo',related_name='infos')中沒有related_name參數,則是如下:

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models

    #獲取信息表對象
    obj = models.Authorinfo.objects.get(country='英國',city='倫敦')
    #通過表名(小寫)反向查詢
    print(obj.author.get_gender_display())

通過qureset查詢

正向查詢

查詢id=1的作者的國家
步驟:
1、獲取作者query對象
2、通過字段__方法

#正向查找
    #獲取queryset數據
    ret = models.Author.objects.filter(id=1)
    #通過字段__方法調用屬性
    print(ret.values('info__city'))
    #運行結果:
    # < QuerySet[{'info__city': '倫敦'}] >

反向查詢

#反向查詢
    # 獲取queryset數據
    ret = models.Authorinfo.objects.filter(city='倫敦')
    # 通過表名__方法調用屬性
    # 如果一對一字段有設置related_name參數=infos,表名__=infos
    print(ret.values('author__name'))

ForeignKey

書籍應出版社為1對多關系即為外鍵

通過對象正向查詢

查詢id=1的書籍的出版社,方法:對象.關聯字段.外表字段

   #獲取對象
    obj =Book.objects.get(id=1)
    #對象.字段名.外表屬性
    print(obj.pulisher.name)

通過對象反向查詢

查詢出版社id=1 的出版社出版的書籍

#獲取出版社對象
    ret = Publisher.objects.get(id=1)
    #對象.表名_set(反向一對多用,反向一對一為對象.表名)得到反向表對象然后調用方法
    ret.book_set.all()

通過qureset查詢

    #正向查詢書籍id=1的出版社
    ret = Book.objects.filter(id=1)
    print(ret.values('pulisher__name'))

    #反向查詢id=1出版社出版的書
    ret2= Publisher.objects.filter(id=1)
    print(ret2.values('book__title'))

ManyToManyField

書籍和作者之間為多對多關系

   #通過對象查詢
    #反向查詢related_name = authors
    obj = Book.objects.get(id=1)
    obj.authors.all()

    #正向查詢
    obj1 = Author.objects.get(id=1)
    obj1.book.all()

    #通過queryset查詢
    #正向查詢
    print(Author.objects.filter(id=1).values('book__title'))
    #反向查詢
    print(Book.objects.filter(id=1).values('authors__name'))

總結:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM