如何使django模型中的id自动增加2?

eqqqjvef  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(279)

因为mysql中的自动增量设置是针对全局的,不能设置为特定的表?
我在考虑是否有可能让django车型的id自动增加2?
型号.py

class Video(models.Model):
    name = model.CharField(max_length=100, default='')
    upload_time = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.name

我该怎么办?谢谢你的帮助。

0x6upsns

0x6upsns1#

你可以帮我做 save() 模型的方法

from django.db.models import Max, F

class Video(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, default='')
    upload_time = models.DateTimeField(blank=True, null=True)

    def save(self, *args,**kwargs): if not self.pk: max = Video.objects.aggregate(max=Max(F('id')))['max'] self.id = max + 2 if max else 1 # if the DB is empty super().save(*args,**kwargs)

    def __str__(self):
        return self.name
tzdcorbm

tzdcorbm2#

可能的解决方案:
假设我有一个客户模型。

Customer.objects.order_by('primay_key_id ').last().primay_key_id + 2)

primay_key_id = models.IntegerField(default=(Customer.objects.order_by('primay_key_id ').last().primay_key_id + 2),primary_key=True)

或者

from django.db import transaction

# Uncomment Lines for Django version less than 2.0

def save(self): 
      "Get last value of Code and Number from database, and increment before save"
      #with transaction.atomic():
        #top = Customer.objects.select_for_update(nowait=True).order_by('-customer_customerid')[0] #Ensures Lock on Database
      top = Customer.objects.order_by('-id')[0]
      self.id = top.id + 1
      super(Customer, self).save()

以上代码对于django 2.0不会有并发问题,因为:
从django 2.0开始,默认情况下会锁定相关行(不确定之前的行为是什么),并且可以使用of参数以与select\u related相同的样式指定要锁定的行!对于较低的版本,你需要是原子的!

from django.db import transaction
def increment():
  with transaction.atomic():        
    ids = Customer.objects.all()
    length = len(ids)-1
    if(length<=0): #Changed to Handle empty Entries
     return 1
    else:
     id = ids[length].customer_customerid
     return id+2

或者

from django.db import transaction
def increment():
  with transaction.atomic():        
    return Customer.objects.select_for_update(nowait=True).order_by('-customer_customerid')[0] #Ensures Atomic Approach!

并将model中的主键设置为integer字段和每个新条目 primary_key_field=increment() 喜欢
然后在models.py中,将主键设置为:

import increment()
primay_key_id = models.IntegerField(default=increment(),primary_key=True)
6rqinv9w

6rqinv9w3#

正确的方法是更改mysql服务器设置
看看这个:自动增量

相关问题