今天闲着没事,突然想起一个以前遇到的一个小问题。一直忘了来验证自己的解决方案,所以今天特意来查询了些资料来验证下自己的想法。整理如下:

  单张表内建立联合主键:

class IotTemp(models.Model):
    mac = models.CharField(max_length=64, blank=False)
    temperature = models.FloatField(default=0.0)
    seq_no = models.IntegerField(blank=False, null=False)
    time = models.DateTimeField(auto_now=False)
    order_id = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'订单id')
    user = models.CharField(max_length=TEXT_LEN, blank=True, verbose_name=u'所属人')
    #seq_no,order_id,mac作为联合主键保证数据不重复
    class Meta:
        app_label = 'iot'
        unique_together = (("seq_no", "order_id", "mac"),)
        verbose_name_plural = u"通用温度表"

  关联表内建立联合主键:

class user(Model):
    id=AutoField(primary_key=True)
    name = CharField(max_length=30)
    age =IntegerField()
class role(Model):
    id=AutoField(primary_key=True)
    name=CharField(max_length=10)

#这是两个model有一个roleUser的model来描述use与role的关系,需要user的id与role的id做外键,也做联合主键,如下:

class roleUser(Model):
    userId=ForeignKey(user)
    roleId=ForeignKey(role)
  class Meta:
      unique_together=("userId","roleId")

当使用Django的ORM来创建数据时,如果创建的数据已经存在,Django会对这个执行语句报错。

 

如果有一批数据要创建,不存在的直接创建存在的进行更新(类似于mysql的DUPLICATE KEY UPDATE)或者不进行任何操作(类似于mysql的ignore),那该如何来做么?

#存在则放弃
try:
    temp = IotTemp.object.create(order_id=1,seq_no=1,mac="wode111",temperature=22.22,time="2018-08-08 11:11:11",user="admin")
except Exception as e:
    pass   #相当于ignore


#存在则更新
try:
    temp = IotTemp.object.create(order_id=1,seq_no=1,mac="wode111",temperature=22.22,time="2018-08-08 11:11:11",user="admin")
except Exception as e:
    temp = IotTemp.object.filter(order_id=1,seq_no=1,mac="wode111").update(temperature=33.33,time="2019-09-09 22:22:22",user="admin")