举例创建一个一对多的简单模型,说明related_name的作用
定义模型
class Person(models.Model): name = models.CharField(verbose_name='作者姓名', unique=True, max_length=10) age = models.IntegerField(verbose_name='作者年龄') class Book(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE) title = models.CharField(verbose_name='书籍名称', max_length=10) pubtime = models.DateField(verbose_name='出版时间')
插入测试数据
apps_person表
apps_book表
编写views函数
如果我们要查询一个作者出版了哪些书籍的话,即通过 一 查询出 多 的那方面。
第一步:先查询到作者的信息
person = Person.objects.get(name='person1')
返回一个person对象
第二步:查询person关联的所有书籍对象
默认返回的是一个 querydict 对象,你可以继续的根据情况来查询等操作
book = person.book_set.all()
注意如果使用filter,返回的是一个set,必须先遍历,才具有book_set方法
def index(request): person = Person.objects.get(name='person1') book = person.book_set.all() for i in book: print(i.title) return render(request, 'index.html')
related_name的作用
在实际项目中,我们使用最多的还是related_name。如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如在Book表中:
class Book(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='person_books') title = models.CharField(verbose_name='书籍名称', max_length=10) pubtime = models.DateField(verbose_name='出版时间')
那么实现上面的需求,可以使用:
person.book_set.all()
或者
person.person_books.all()