django 复合主键(composit primary key)

摘要: 项目开发中,不是所有表都只有一个主键。如果只有一个主键的情况,django 很容易做,也很好做。在models.py 中定义 class 时,可以直接实现:比如:class Category(models.Model):    catid = models.CharField(primary_key=True)

项目开发中,不是所有表都只有一个主键。如果只有一个主键的情况,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)
.........
这样做的话,在保存的时候,肯定会出错,正确的做法应该是 :

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 没有,看来还得继续找办法。有新方法继续更新。

上一篇: 利用java jxl 创建,读取,更新excel文档
下一篇: python读写配置文件

Avatar

www.yooi.net 评论于: 2016-04-19

这样创建的并不是联合主键
而是 先用 catid  创建主键,再创建 "catid", "bigcate" 的联合唯一索引

Avatar

学djano 评论于: 2012-10-04

这样就行了:
class Category(models.Model):
    catid = models.CharField(max_length=50,primary_key=True)       bigcate = models.CharField(max_length=50) #这里不设置主键了
    .........
    class Meta:
        db_table = 'my_category'
        unique_together = ("catid", "bigcate") 
注意get方法只能返回唯一一个,使用一个主键查询时可能出错,必须用联合主键
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号