今天閑着沒事,突然想起一個以前遇到的一個小問題。一直忘了來驗證自己的解決方案,所以今天特意來查詢了些資料來驗證下自己的想法。整理如下:
單張表內建立聯合主鍵:
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")