about foreignKey

#关系对象#

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateTimeField()
    authors = models.ManyToManyField(Author)

    def __str__(self):
        return self.headline

例如,b是Blog的对象, b.entry_set就能够得到Entry的对象,就能够操做  
1 Entry.objects.filter(blog__name__exact='Beatles Blog'),查找blog的对象的数据
2 Blog.objects.filter(entry__headline__contains='Lennon'), 反过来也能够

3 select_related(),表示能够把第一次查找的数据加入到缓存,第二次查找就到缓存里面查找
   e = Entry.objects.select_related().get(id=2)
   print e.blog
   print e.blog
4. XXX_set  至关于得到XXX表的对象(必须得有一个类的实例,若是用Blog.entry_set, 发生错误)
   b = Blog.objects.get(id=1)
   b.entry_set.all() # Returns all Entry objects related to Blog.

    b.entry_set is a Manager that returns QuerySets.
   b.entry_set.filter(headline__contains='Lennon')
   b.entry_set.count()
5. related_name 参数
   能够重载”XXX_set”名字.举例,若是把”Entry”模型修改成”blog =ForeignKey(Blog, related_name=’entries’)”
6. get_FOO_display()

   GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
class Person(models.Model):
    name = models.CharField(max_length=20)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


p = Person(name='John', gender='M')
p.save()
p.gender
‘M’
p.get_gender_display()
 'Male'
7. get_object_or_404()

# Get the Entry with a primary key of 3
e = get_object_or_404(Entry, pk=3)

# Get the author of blog instance e with a name of 'Fred'
a = get_object_or_404(e.authors, name='Fred')

# Use a custom manager 'recent_entries' in the search for an
# entry with a primary key of 3
e = get_object_or_404(Entry.recent_entries, pk=3)

8. get_list_or_404()

get_list_or_404 行为与 get_object_or_404() 相同,可是它用 filter() 取代了 get() 。若是列表为空,它将引起 Http404