есть приложение, управляемое БД, где есть таблица (представление), определенная в БД (psql), имеющая 2 ключа вместе в качестве первичного ключа.Моя принадлежащая модель 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_to Вместе должно работать следующим образом.Выполнение следующего запроса в БД работает нормально:
insert into t_s.vt_s_i (t_s_id, item_number, ...) values (10, 20, ...);
и завершается неудачей, только если уже существует комбо (ts, item_number).
Попытка вставить TSI из djangoОболочка однако терпит неудачу:
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 (с 0 TSI), я могу вставить первый без проблем.После этого изменение item_number с новой вставкой приведет к ошибке .full_clean (), и save будет перезаписывать вместо ее добавления.
Может кто-нибудь дать мне решение, как я должен определить свою модель, чтобы иметь возможность вставлятьвторой ци любому ts с другим item_number?Я полагаю, что unique_together в определении META на самом деле не работает.
Спасибо за репозитории.