举例讲解Django中数据模型访问外键值的方法
先设置一个关于书本(book)的数据模型:
fromdjango.dbimportmodels classPublisher(models.Model): name=models.CharField(max_length=30) address=models.CharField(max_length=50) city=models.CharField(max_length=60) state_province=models.CharField(max_length=30) country=models.CharField(max_length=50) website=models.URLField() def__unicode__(self): returnself.name classAuthor(models.Model): first_name=models.CharField(max_length=30) last_name=models.CharField(max_length=40) email=models.EmailField() def__unicode__(self): returnu'%s%s'%(self.first_name,self.last_name) classBook(models.Model): title=models.CharField(max_length=100) authors=models.ManyToManyField(Author) publisher=models.ForeignKey(Publisher) publication_date=models.DateField() def__unicode__(self): returnself.title
访问外键(ForeignKey)值
当你获取一个ForeignKey字段时,你会得到相关的数据模型对象。例如:
>>>b=Book.objects.get(id=50) >>>b.publisher <Publisher:ApressPublishing> >>>b.publisher.website u'http://www.apress.com/'
对于用``ForeignKey``来定义的关系来说,在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。通过一个``publisher``对象,直接获取books,用publisher.book_set.all(),如下:
>>>p=Publisher.objects.get(name='ApressPublishing') >>>p.book_set.all() [<Book:TheDjangoBook>,<Book:DiveIntoPython>,...]
实际上,book_set只是一个QuerySet,所以它可以像QuerySet一样,能实现数据过滤和分切,例如:
>>>p=Publisher.objects.get(name='ApressPublishing') >>>p.book_set.filter(name__icontains='django') [<Book:TheDjangoBook>,<Book:ProDjango>]
属性名称book_set是由模型名称的小写(如book)加_set组成的。