有一个数据库驱动的应用程序,其中在数据库(psql)中定义了一个表(视图),该表具有两个键作为主键。我所属的django模型如下:
class TS(models.Model):
id = models.AutoField(primary_key=True)
...
class Meta:
db_table = '"t_s\".\"vt_s"'
managed = False
class TSI(models.Model):
ts = models.ForeignKey(TS, primary_key=True, on_delete=models.PROTECT, db_column='t_s_id')
item_number = models.IntegerField()
...
class Meta:
db_table = '"t_s\".\"vt_s_i"'
managed = False
unique_together = (('ts', 'item_number'),)
。
或者至少我认为unique_together应该像这样工作。在数据库中运行以下查询可以正常工作:
insert into t_s.vt_s_i (t_s_id, item_number, ...) values (10, 20, ...);
并且仅在(ts,item_number)组合已经存在时失败。
但是尝试从django shell中插入TSI失败:
In [29]: ts = TS.objects.filter()[8]
In [28]: ts.id
Out[28]: 11
In [30]: ts.tsi_set.all()
Out[30]: <QuerySet []>
In [31]: tsi = TSI(description='First description', t_s = ts, item_number = '600033')
In [32]: tsi.full_clean()
In [33]: tsi.save()
In [34]: ts.tsi_set.all().values('t_s_id', 'item_number', 'description')
Out[34]: <QuerySet [{'item_number': 600033, 'description': 'First description', 't_s_id': 11}]>
In [35]: tsi = TSI(description='New description', t_s = ts, item_number = '999999')
In [36]: tsi.full_clean()
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
<ipython-input-36-3a0eb883d57f> in <module>()
----> 1 tsi.full_clean()
~/.virtualenvs/srd/lib/python3.4/site-packages/django/db/models/base.py in full_clean(self, exclude, validate_unique)
1164
1165 if errors:
-> 1166 raise ValidationError(errors)
1167
1168 def clean_fields(self, exclude=None):
ValidationError: {'t_s': ['T S I with this T S already exists.']}
In [37]: tsi.save()
In [38]: ts.tsi_set.all().values('task_sheet_id', 'item_number', 'description')
Out[38]: <QuerySet [{'item_number': 999999, 'description': 'New description', 't_s_id': 11}]>
In [39]:
。因此,如果有一个空的TS(TSI为0),我可以毫无问题地插入第一个。之后,使用新插入项更改item_number将导致.full_clean()错误,并且保存将被覆盖而不是添加。
谁能给我一个解决方案,我应该如何定义我的模型,以便能够向具有不同item_number的任何ts插入第二个tsi?我想META定义中的unique_together真的不起作用。
谢谢你的来信。