首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django中的组合主键

django中的组合主键
EN

Stack Overflow用户
提问于 2015-02-25 14:45:39
回答 3查看 56K关注 0票数 56

我有一个具有复合主键的遗留数据库表。我不认为我能够改变结构来包含一个代理键,因为有一些代码使用了这个表。在django中,我不能使用该表,因为它没有主键(非复合的)。

django模型支持复合主键吗?如果没有,有没有在不改变表结构的情况下的解决方法?

附注:我使用的是postgresql。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-25 14:54:28

尝试类似下面的代码:

代码语言:javascript
复制
class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField(primary_key=True)
    key2 = models.IntegerField()

或者,如果您只想要唯一的混合字段:

代码语言:javascript
复制
class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField()
    key2 = models.IntegerField()

编辑:我想指出的是,如果有3列,这种方法就会有问题。Update查询不起作用,因为它试图更新(将pk字段放在“SET”后面)唯一的字段,但显然失败了。

票数 73
EN

Stack Overflow用户

发布于 2020-11-25 21:01:00

公认的答案是好的。然而,它有点老了。为了支持UniqueConstraint,可能会弃用unique_together。因此,更好的方法是:

代码语言:javascript
复制
UniqueConstraint(fields = ['key1', 'key2'], name = 'constraint_name')
票数 18
EN

Stack Overflow用户

发布于 2020-12-22 14:14:09

我使用从django AutoField继承的虚拟字段来solved它,它将来自多个字段的值组合到单个JSON dict中。

这使得这样的模型与django管理和遗传视图兼容。

$ pip install django-viewflow --pre

代码语言:javascript
复制
from viewflow.fields import CompositeKey

class Seat(models.Model):
    id = CompositeKey(columns=['aircraft_code', 'seat_no'])
    aircraft_code = models.ForeignKey(
        Aircraft, models.DO_NOTHING,
        db_column='aircraft_code'
    )
    seat_no = models.CharField(max_length=4)

这使得可以像访问PostgreSQL TimeScaleDB表一样访问legacy databases

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28712848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档