django 复合主键(composit primary key)
By:Roy.LiuLast updated:2012-09-11
项目开发中,不是所有表都只有一个主键。如果只有一个主键的情况,django 很容易做,也很好做。
在models.py 中定义 class 时,可以直接实现:
比如:
class Category(models.Model):
catid = models.CharField(primary_key=True)
但是,在很多表中,有多个字段作为主键,比如主从表的从表,通常就是多个字段组成的复合主键,但如果我们用上面类似的方式来做,在保存的时候可能会出错。比如如下方式:
class Category(models.Model):
catid = models.CharField(primary_key=True)
bigcate = models.CharField(primary_key=True)
.........
这样做的话,在保存的时候,肯定会出错,正确的做法应该是 :
这样保存就可以这样了:
PS:这样做,在保存的时候,肯定是没有问题的,但后来我在测试 get,filter 方法时,还是会报错。说明这种方法,还是有点问题。总是说有id 没找到,其实这是 django 默认的 primary key 没有,看来还得继续找办法。有新方法继续更新。
在models.py 中定义 class 时,可以直接实现:
比如:
class Category(models.Model):
catid = models.CharField(primary_key=True)
但是,在很多表中,有多个字段作为主键,比如主从表的从表,通常就是多个字段组成的复合主键,但如果我们用上面类似的方式来做,在保存的时候可能会出错。比如如下方式:
class Category(models.Model):
catid = models.CharField(primary_key=True)
bigcate = models.CharField(primary_key=True)
.........
这样做的话,在保存的时候,肯定会出错,正确的做法应该是 :
class Category(models.Model): catid = models.CharField(max_length=50) #这里不设置主键了 bigcate = models.CharField(max_length=50) #这里不设置主键了 ......... class Meta: db_table = 'my_category' unique_together = ("catid", "bigcate") #这是重点
这样保存就可以这样了:
cat=models.Category(catid='123',bigcat='234',......) cat.full_clean() cat.save()
PS:这样做,在保存的时候,肯定是没有问题的,但后来我在测试 get,filter 方法时,还是会报错。说明这种方法,还是有点问题。总是说有id 没找到,其实这是 django 默认的 primary key 没有,看来还得继续找办法。有新方法继续更新。
From:一号门
Previous:利用java jxl 创建,读取,更新excel文档
Next:python读写配置文件
COMMENTS