Django在主键和唯一约束上建立unique_together模型

时间:2017-07-05 08:56:59

标签: python django django-models django-rest-framework

我有一个下面给出的模型。

class mc(models.Model):
ap=models.CharField(max_length=50,primary_key=True)
de=models.CharField(max_length=50)
STATUS=models.CharField(max_length=12,default='Y')
class Meta:
    unique_together=(("ap","de"),)
    db_table='mc'

我已经写了ap ='1',de ='2'到表mc。

+----+----+--------+
| ap | de | STATUS |
+----+----+--------+
| 1  | 2  | Y      |
+----+----+--------+

然后我试着写ap ='1'和de ='3',但它只是覆盖了前一个。现在该表包含

+----+----+--------+
| ap | de | STATUS |
+----+----+--------+
| 1  | 3  | Y      |
+----+----+--------+

然后我试着写ap ='2',de ='3'及其工作。由于我给了unique_together,ap和de的组合不起作用。

但如果我没有在ap或de上使用'primary_key'或'unique'约束,unique_together会工作。

你能帮我吗?如何在主键上使用unique_together?

实际问题是,我有另一个类mc1,它使用外键到字段ap。

class mc1(models.Model):                                                                                            

    test=models.ForeignKey(mc,on_delete=models.CASCADE,to_field='ap')

因此mc.ap应该是唯一的,以定义一个外键。

1 个答案:

答案 0 :(得分:6)

Django不支持多列主键。几年来一直是feature request。每个模型must have one primary key

在您的情况下,如果ap是主键,则(ap=1, de=2)中的每个值都必须是唯一的。无法同时存储(ap=1, de=3)unique_together

也许你可以添加另一个字段作为主键。然后,您就可以('ap', 'de')获得<div class="row"> <div class="col-sm-12 col-xs-12 col-lg-12 col-md-12 welcome"> <ul class="nav navbar-nav navbar-nav-primary"> <li class="active"> <a href="#one" data-toggle="tab"> <i class="fa fa-map-marker" aria-hidden="true"></i> <span class="li-text">Location</span> </a> </li> <li> <a href="#two" data-toggle="tab"> <i class="fa fa-heartbeat" aria-hidden="true"></i> <span class="li-text">Heartbeats</span> </a> </li> <li> <a href="#three" data-toggle="tab"> <i class="fa fa-power-off" aria-hidden="true"></i> <span class="li-text">Reboots</span> </a> </li> <li> <a href="#four" data-toggle="tab"> <i class="fa fa-compress" aria-hidden="true"></i> <span class="li-text">Reconnects</span> </a> </li> <li> <a href="#five" data-toggle="tab"> <i class="fa fa-battery-full" aria-hidden="true"></i> <span class="li-text">Charge</span> </a> </li> </ul> </div>