Django使用聯合主鍵


今天閑着沒事,突然想起一個以前遇到的一個小問題。一直忘了來驗證自己的解決方案,所以今天特意來查詢了些資料來驗證下自己的想法。整理如下:

  單張表內建立聯合主鍵:

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")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM