我有一个具有复合主键的遗留数据库表。我不认为我能够改变结构来包含一个代理键,因为有一些代码使用了这个表。在django中,我不能使用该表,因为它没有主键(非复合的)。
django模型支持复合主键吗?如果没有,有没有在不改变表结构的情况下的解决方法?
附注:我使用的是postgresql。
发布于 2015-02-25 14:54:28
尝试类似下面的代码:
class MyTable(models.Model):
class Meta:
unique_together = (('key1', 'key2'),)
key1 = models.IntegerField(primary_key=True)
key2 = models.IntegerField()或者,如果您只想要唯一的混合字段:
class MyTable(models.Model):
class Meta:
unique_together = (('key1', 'key2'),)
key1 = models.IntegerField()
key2 = models.IntegerField()编辑:我想指出的是,如果有3列,这种方法就会有问题。Update查询不起作用,因为它试图更新(将pk字段放在“SET”后面)唯一的字段,但显然失败了。
发布于 2020-11-25 21:01:00
公认的答案是好的。然而,它有点老了。为了支持UniqueConstraint,可能会弃用unique_together。因此,更好的方法是:
UniqueConstraint(fields = ['key1', 'key2'], name = 'constraint_name')发布于 2020-12-22 14:14:09
我使用从django AutoField继承的虚拟字段来solved它,它将来自多个字段的值组合到单个JSON dict中。
这使得这样的模型与django管理和遗传视图兼容。
$ pip install django-viewflow --pre
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
https://stackoverflow.com/questions/28712848
复制相似问题