最近使用django做后台实现了一个简单的在线博客系统。其中使用django建立模型(也就是所谓的数据表)碰到了很多问题,也学到了很多,现在奉献出来与大家分享。
1.我碰到的第一个问题是要建立一个日志的模型。日志中有作者属性,其中作者是一个模型。定义如下:
//这个和定义面向关系数据库很类似,就不说了~
class Users(models.Model):
username = models.CharField(primary_key = True, max_length = 30)
password = models.CharField(max_length = 30)
nickname = models.CharField(max_length = 30)
现在来定义日志的模型。
作者和日志是一对多关系,所以可以在Diary中使用ForeignKey
class Diary(models.Model):
user = models.ForeignKey(Users)
Title = models.CharField(max_length = 100)
Content = models.CharField(max_length = 1000) #no restriction
Type = models.CharField(max_length = 30)
Attri = models.CharField(max_length = 10)
PublicDate = models.DateField()
但是使用这个模型就要小心了~因为如果我们检索日志,直接返回Diary.objects.all()的话,那么返回的结果中,user是空的!因为在Diary中,User属性只是一个引用。这时就要:d = Diary.objects.select_related();这个很关键
2. 建立好友模型。该模型描述如下:一个用户有很多好友,并且可以对好友进行分组。如果按照面向关系的数据库的定义的话,我们可以这样:首先定义个user表,
然后定义一个Group表,表中有user, friend, Groupname属性。但是使用Django建立这样的模型时,它会提示出错~不能在一个模型中存在两个指向统一模型的引用。这时就需要另外一种定义模型的方法。
分析好友模型,我们可以得知,用户与其好友是多对多关系。这样就好办了,django提供了一个ManyToManyField关键字,用来定义这种关系。
class Friend(models.Model):
friend = models.ManyToManyField(Users)
class Group(models.Model):
user = models.ForeignKey(Users)
member = models.ForeignKey(Friend)
groupname = models.CharField(max_length = 100)
def __unicode__(self):
return self.groupname
这样便可以定义个多对多关系了~
----David Cai 2009-8-31晚于金山公司