我正在为我工作的公司开发一个内部应用程序,我想使用Django来学习它和Python,但是我在PKs上遇到了一些问题。
我正在尝试模拟当前应用程序的一部分,其中两个MySQL表,TaskCategory和Tasks,处理需要执行的任务。每个任务都属于一个TaskCategory,并且TaskCategory中的每个项目都有自己单独的递增编号。因此,如果“办公室”有15个任务,向其添加另一个任务将使其Task.taskid = 16,但是向"Vehicles“添加一个任务将使Tasks.taskid = 51,而不是17。这将被用作跟踪编号,例如Vehicles-51任务。
这种单独的递增是通过在任务中使用复合主键来实现的,该主键由taskcategoryid和taskid (自动递增)组成。顺便说一句,Tasks.taskcategoryid不是FK(我不认为它可以是FK,因为它是复合PK的一部分)。
由于Django不喜欢超过1个PK列,因此我在复制此功能时遇到了一些困难。我已经尝试了taskid (自动递增PK)和taskcategoryid (FK)的unique_together,并且我已经尝试了2个自动递增列(id和taskid),但是你不能有多个自动递增列。
使用Django可以实现这种递增功能吗?我更喜欢在不修改源代码的情况下这样做,但如果需要的话,我会这么做的。
发布于 2010-08-11 07:51:43
你在这里的目标是什么?
如果您试图保持与旧应用程序的字段到字段表的兼容性,那么就会遇到问题,因为(正如您所观察到的) Django不支持compound/composite keys --它实际上更喜欢surrogate key。考虑到Django允许的操作,以及当前对“正确的”数据库设计的思考,代理键是有意义的。
如果您真正想要做的是保持大多数查询相同(或基本相似),那么可以不使用现有的自然/组合键字段,而是删除旧的主键约束,为Django添加一个新的代理键,然后将Meta data添加到模型中,以声明组成旧组合键的字段是unique_together。Django将对此进行解释,并添加适当的唯一索引。您将需要在对象创建中添加一些代码来处理递增/分配Django ids,但最终结果是所有旧的关系都由TaskCategory和数据库强制执行。
作为示例,下面是我在棋盘游戏锦标赛中用来跟踪玩家的一个应用程序的模型的一部分:
class Player(models.Model):
badge = models.IntegerField()
name = models.CharField( max_length = 99 )
class Round(models.Model):
name = models.CharField( max_length = 9 )
number = models.IntegerField()
class Table(models.Model):
round = models.ForeignKey( Round )
number = models.IntegerField( 'table number')
class Meta:
unique_together = ( 'round', 'number' )
class Seat(models.Model):
table = models.ForeignKey( Table )
position = models.IntegerField( 'seat number' )
player = models.ForeignKey( Player )
class Meta:
unique_together = ( 'table', 'seat' )在本例中,我使用unique_together来确保在不同的轮次中重复使用桌号,并且不同的桌上的座位位置是相同的,但您永远不会多次遇到相同的圆桌、桌子和座位组合。
https://stackoverflow.com/questions/3453897
复制相似问题