Python - Django

Django - ORM 一对多,多对多操作

2017-10-25  本文已影响49人  廖马儿

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.思考是否是多对多

一本书有多个作者,那么一个作者可以写多本书。

上一篇下一篇

猜你喜欢

热点阅读