django中的一对一,一对多,多对多
http://www.cnblogs.com/pythonxiaohu/p/5814247.html
http://luozhaoyu.iteye.com/blog/1510635
http://www.cnblogs.com/yaabb163/p/6357313.html (详细)
一对多或者多对一
这种关系可以使用外键来解决。
Django的表的多对多关系
class UserGroup(models.Model):
name = models.CharField(max_length=32)
Class UserInfo(models.Model):
username = model.CharField(max_length=16)
u2g = models.ManyToManyField(UserGroup)
一对多的时候,查询一对应的多,创建等可以通过 xxx_set
models.py:
class Album(models.Model):
artist = models.CharField(max_length=16)
album_title = models.CharField(max_length=8)
album_logo = models.CharField(max_length=512)
def __str__(self):
return self.album_title
def __unicode__(self):
return self.album_title
class Song(models.Model):
album = models.ForeignKey(Album, on_delete=models.CASCADE) # 这个是级联,删除的时候有用
name = models.CharField(max_length="16")
=====
views.py:
# 查询
album.song_set.all() # 查出此album的所有关联的song
<QuerySet [<Song: Song object>]>
# 创建
album.song_set.create(name="xxx") # album这个外键可以不填写,因为是此创建的
注意:song的实例得到之后,song.album (也就是通过外键属性,得到的是一个外键Model的一个对象)
song.album
<Album: Red>
注意:也可以在template中直接使用_set,就不必在views中去查xxx_set了。
个数:
album.song_set.count() # 得到多少个
经验
1.一对多或者多对一,都是在多那里做外键:
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
一个出版社可以出多本书。在书的类中添加外键。
2.思考是否是多对多
一本书有多个作者,那么一个作者可以写多本书。
网友评论