外键的操作

models.py

class Publisher(models.Model):
    name = models.CharField(max_length=32)

class Book(models.Model):
    title = models.CharField(max_length=32)
    publisher = models.ForeignKey('Publisher',on_delete=models.CASCADE)

1、执行数据库迁移的命令

2、在sql填入数据

添加str方法:

class Publisher(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return '<Publisher: {} - {}>'.format(self.pk, self.name)

class Book(models.Model):
    title = models.CharField(max_length=32)
    publisher = models.ForeignKey('Publisher',on_delete=models.CASCADE)

    def __str__(self):
        return '<Book: {} - {}>'.format(self.pk, self.title)

 

import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django
    django.setup()

    from app01 import models

    #正向  多---》一
    book_obj = models.Book.objects.get(pk=1)
    # print(book_obj) #<Book: 1 - 二狗的幸福一生>
    # print(book_obj.publisher)  #所关联的对象 #<Publisher: 1 - 二狗出版社>
    # print(book_obj.publisher_id) #1

    #反向 一---》多
    pub_obj = models.Publisher.objects.get(pk=1)
    # print(pub_obj) #<Publisher: 1 - 二狗出版社>
    # print(pub_obj.book_set) #关系管理对象
    # print(pub_obj.book_set.all())

    # 要求:想在Publisher里面拿到书的方法
    # 方法一: 不指定related_name  用表面小写_set
    # print(pub_obj.book_set)
    # print(pub_obj.book_set.all()) #出版社出版的所有书籍
    
    #方法二: 指定了related_name='books' books
    # 在Book类的publisher的字段中,指定一个叫related_name='books'
    # print(pub_obj.books)
    # print(pub_obj.books.all())
基于字段的查询  #查出版社
#基于字段的查询  #查出版社
    # 不指定了related_name 用表名小写就可以了 用book
    # ret = models.Publisher.objects.filter(book__title='二狗的幸福一生')
    # print(ret)  # <QuerySet [<Publisher: <Publisher: 1 - 二狗出版社>>]>

    # 指定了related_name='books' books
    # ret = models.Publisher.objects.filter(books__title='二狗的幸福一生')
    # print(ret) #<QuerySet [<Publisher: <Publisher: 1 - 二狗出版社>>]>

    # 指定了related_name='books' 并且 指定了 related_query_name='book',
    # ret = models.Publisher.objects.filter(book__title='二狗的幸福一生')
    # print(ret)  # <QuerySet [<Publisher: <Publisher: 1 - 二狗出版社>>]>

# 查书

    # ret = models.Book.objects.filter(publisher__name='二狗出版社')
    # print(ret) #<QuerySet [<Book: <Book: 1 - 二狗的幸福一生>>, <Book: <Book: 3 - 二狗的产后护理>>]>
# 注:跨表查询用__
posted @ 2019-03-07 21:28  小菜鸟111  阅读(423)  评论(0编辑  收藏  举报