Django ORM模型之related_name作用

1,504 views次阅读
没有评论

举例创建一个一对多的简单模型,说明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表

Django

apps_book表

Django

编写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()
Honest1y
版权声明:本站原创文章,由Honest1y于2019年04月09日发表,共计2342字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)