Джанго уникален вместе - PullRequest
0 голосов
/ 28 октября 2018

есть приложение, управляемое БД, где есть таблица (представление), определенная в БД (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 на самом деле не работает.

Спасибо за репозитории.

...