django_4数据库2——表外键

表关系:

  • many to one
  • many to many
  • one to one

many to one


记录是如何创建出来的?      先创建one,在在创建many,创建时加入ForeignKey

from django.db import models

# Create your models here.
class Enter(models):
    name = models.CharField(max_length=30)
    
    def __str__(self):
        return self.name
        
    __repr__ = __str__
    
class Blog(models):
    name = models.CharField(max_length=30)
    entry = models.ForeignKey(Enter)      #参数为one项的类名
    
    def __str__(self):
        return self.name
        
    __repr__ = __str__   

使用交互进行检索

In [1]: from blog.models import Entry, Blog

In [2]: entry1 = Entry.objects.create(name='alen')            #创建对应的one项(Entry)

In [3]: entry2 = Entry.objects.create(name='max')

In [4]: entry3 = Entry.objects.create(name='carl')

In [6]: blog1 = Blog.objects.create(name='alen_blog1', entry=entry1)  #创建对应many项

In [8]: blog1.entry          #(many)从many端进行检索到one
Out[8]: alen

In [9]: blog1.entry_id
Out[9]: 1

In [10]: entry1.blog_set        #(one)它所对应的blog(many)都有哪些
Out[10]: <django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager at 0x7f438ce2db00>

In [11]: entry1.blog_set.all()
Out[11]: <QuerySet [alen_blog1]>

如何把这这种对应的结果关系如何在web界面实现?

many to many

class Author(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Book(models.Model):       #一个作者可以有多本书,一本书可以有多个作者 
    name = models.CharField(max_length=30)
    author = models.ManyToManyField(Author)
    def __str__(self):
        return self.name

同步表,数据库中:

show tables;
| blog_book                  |
| blog_book_author           |自动创建的两个表的关系表
| blog_user                  |

对数据进行管理

[root@centos7 csvt04]# python3 manage.py shell

In [2]: from blog.models import Author, Book

In [3]: Author.objects.create(name='Alen')
Out[3]: <Author: Alen>

In [4]: Author.objects.create(name='Ben')
Out[4]: <Author: Ben>

In [5]: Author.objects.create(name='Carl')
Out[5]: <Author: Carl>

In [6]: Author.objects.create(name='Dev')
Out[6]: <Author: Dev>

In [7]: author = Author.objects.all()

In [8]: author
Out[8]: <QuerySet [<Author: Alen>, <Author: Ben>, <Author: Carl>, <Author: Dev>]>

In [9]: b1 = Book()

In [10]: b1.name = 'python book1'

In [11]: b1.save()

In [12]: alen = Author.objects.get(name='Alen')

In [13]: alen
Out[13]: <Author: Alen>

In [14]: b1.author.add(alen)

In [16]: b1.author.add(author[1])

In [17]: b1.author.all()
Out[17]: <QuerySet [<Author: Alen>, <Author: Ben>]>

In [18]: b1.author.add(author[2])

In [19]: b1.author.remove(alen)

In [20]: b1.author.all()
Out[20]: <QuerySet [<Author: Ben>, <Author: Carl>]>

In [21]: b1.author.filter(name='Carl')
Out[21]: <QuerySet [<Author: Carl>]>

In [22]: b1.author.filter(name='Dev')
Out[22]: <QuerySet []>

In [23]: alen
Out[23]: <Author: Alen>

In [24]: alen.book_set.all()
Out[24]: <QuerySet []>
In [26]: alen.book_set.add(b1) In [27]: alen.book_set.all() Out[27]: <QuerySet [<Book: python book1>]> In [28]: alen.book_set.create(name='python boo2') Out[28]: <Book: python boo2> In [29]: alen.book_set.all() Out[29]: <QuerySet [<Book: python book1>, <Book: python boo2>]> In [30]: Book.objects.all() Out[30]: <QuerySet [<Book: python book1>, <Book: python boo2>]>
原文地址:https://www.cnblogs.com/daduryi/p/6837796.html