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

>>> from website.books import models
>>> 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>]




posted @ 2009-12-11 17:18  kid的笔记本  阅读(1163)  评论(0编辑  收藏  举报