Django独一无二

时间:2018-10-28 09:09:13

标签: python django django-models

有一个数据库驱动的应用程序,其中在数据库(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真的不起作用。

谢谢你的来信。

0 个答案:

没有答案