一、一对多(外键)ForeignKey
related_name=string,最好指定,如果有多个键值要指定外键,避免冲突例子:一个作者对应多本书,一本书只有一个作者
model代码:
class Person(models.Model);
name = models.CharField('作者姓名', max_length=10)
age = models.IntegerField('作者年龄')
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField('书籍名称', max_length=10)
pubtime = models.DateField('出版时间')
1.1 从作者出发获取书籍
django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。filter好像有缓存数据的功能,第一次查询数据库并生成缓存,下次再调用filter方法的话,直接取得缓存的数据,会get方法每次执行都是直接查询数据库的,不知道这个是不是正确
person = Person.objects.fiter(你的条件)
book = person.book_set.all()
1.2.从书籍出发获取作者
p = book.person
二.多对多 ManyToManyField
models 代码
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author)
2.1 从书籍出发获取作者
django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错
b = Book.objects.get(id=50)
b.authors.all()
b.authors.filter(first_name='Adam')
2.2.从作者出发获取书籍
a = Author.objects.get(id=1)
a.book_set.all()
2.3.添加对象方法
a = Author.objects.get(id=1)
b = Book.objects.get(id=50)
b.authors.add(a)
2.4.删除对象对象方法
a = Author.objects.get(id=1)
b = Book.objects.get(id=50)
b.authors.remove(a) 或者 b.authors.filter(id=1).delete()