Foreign Key,Many to Many
2.Foreign Key
1)ForeignKey用来定义多对一得关系,ForeignKey的参数是主键的类,就像文章开始
用的例子,Book.publisher的ForeignKey参数就是Publisher类。
2)对象也可以和自身关联,用mdels.ForeignKey('self'),这样就建立了一种递归关系。
3)在2)中用到了字符串,是的,外键参数可以用字符串的,这个在参数类还没有定义的时候
尤其适用,比如在Publisher类没有定义时,你完全可以用models.ForeignKey('Publisher')
注意:只能对同一个models.py文件中的模型适用字符串引用,其他的或者导入的模型不可用。
4)访问
在文章开始给出的models可以看出,Book中有外键publisher
如下代码所示,通过book的object访问publisher同访问正常field没区别。
但是通过主键Publisher访问book时,需要用book_set的形式。
即:主键中模型类名的小写+_set
>>> b = models.Book.objects.get(tille='djangobook')
>>> p=models.Publisher.objects.filter(name='Apress')[0]
>>> b.publisher
<Publisher: name:Apress, address:2855 Telegraph Avenue>
>>> p.book_set.all()
[<Book: djangobook>, <Book: pythonbook>]
3.ManyToMany
1)ManyToManyField放在哪个模型中
分析文章开始给出的例子:一个作者可以写多本书,一本书可以有多本书
这个Field放在Book中还是Author中都可以。但是不能两个都放。
2)关于自关联以及字符串参数等同ForeignKey一样。
3)访问同ForeignKey类似
这里说明一点。book_set属性一定是author的一条记录而不能是QuerySet
正向访问:
>>> book = models.Book.objects.get(tille='djangobook')
>>> book.authors.all()
[<Author: yonggao>, <Author: xiuqi>]
反向访问:
>>> aut = models.Author.objects.filter(last_name__contains='yonggao')
>>> aut.book_set.all()
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'book_set'
>>>
>>> aut = aut[0]
>>> aut.book_set.all()
[<Book: djangobook>, <Book: pythonbook>]
![](http://img.zemanta.com/pixy.gif?x-id=134456d5-20a6-8c58-9a24-90f16019f543)