django 复合主键(composit primary key)

项目开发中,不是所有表都只有一个主键。如果只有一个主键的情况,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 没有,看来还得继续找办法。有新方法继续更新。

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
[本日志由 轻舞肥羊 于 2012-09-12 07:58 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: django
相关日志:
评论: 2 | 引用: 0 | 查看次数: -
回复回复www.yooi.net[2016-04-19 12:03 AM | del]
这样创建的并不是联合主键
而是 先用 catid  创建主键,再创建 "catid", "bigcate" 的联合唯一索引
回复回复学djano[2012-10-04 06:32 PM | del]
这样就行了:
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方法只能返回唯一一个,使用一个主键查询时可能出错,必须用联合主键
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.