2017-06-29 107 views
1

我试图在Django中创建一个具有自定义id属性的模型。我希望它总是等于10000和该实例的当前ID号码的总和。我到底该怎么写?我是否必须在视图中做任何事情?在Django模型中创建一个自定义id字段

编辑:我最好把我使用的代码,以防万一。

models.py

class Schedules(models.Model): 
    course_name = models.CharField(max_length=128, choices=COURSE_NAME_CHOICES, default='a-plus') 
    location = models.CharField(max_length=128, choices=LOCATION_CHOICES, default='south_plainfield') 
    room = models.CharField(max_length=128, choices=ROOM_CHOICES, default='A') 
    start_date = models.DateField(auto_now=False, auto_now_add=False, default=datetime.date.today) 
    start_time = models.CharField(max_length=128, choices=START_TIME_CHOICES, default='eight-thirty am') 
    end_time = models.CharField(max_length=128, choices=END_TIME_CHOICES, default='eight-thirty am') 
    instructor = models.CharField(max_length=128, choices=INSTRUCTOR_CHOICES, default='adewale') 
    total_hours = models.CharField(max_length=128, choices=TOTAL_HOURS_CHOICES, default='six') 
    hours_per_class = models.CharField(max_length=128, choices=HOURS_PER_CLASS_CHOICES, default='four_and_half') 
    frequency = models.CharField(max_length=128) 
    status = models.CharField(max_length=128, choices=STATUS_CHOICES) 
    interval = models.CharField(max_length=128, choices=INTERVAL_CHOICES, default='1 day') 
    initiated_by = models.CharField(max_length=128, null=True) 
    schedule_id = models.IntegerField(default=0) 

views.py

def start_One_Schedule(request): 
    form = ScheduleForm() 
    if request.method == 'POST': 
     form = ScheduleForm(request.POST) 

     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.initiated_by = request.user.username 
      obj.save() 
      return render(request, 'schedule/schedule.html', {}) 
     else: 
      print(form.errors) 

    return render(request, 'schedule/start_one_schedule.html', {'form': form}) 

回答

2

你可以在你编写自定义ID字段建模这样

class ABC(models.Model): 
    custom_id = models.IntegerField(default=0) 

    def save(self, flag=True, *args, **kwargs): 
     # Save your object. After this line, value of custom_id will be 0 which is default value 
     super(ABC, self).save(flag=True, *args, **kwargs) 
     # Here value of custom_id will be updated according to your id value 
     if flag:   
      self.custom_id = self.id + 10000 
      self.save(flag=False, *args, **kwargs) 

flag是必需的,否则将启动递归将会无限地运行。

+0

我添加了我的代码。我需要做到这一点,以免它干扰我的其他领域。 –

+0

我已添加注释以详细说明我的代码。它不会干扰你的其他领域。 –

+0

难道你不应该把'* args,** kwargs'传递给super吗? – schillingt

2

在模型上创建一个属性,将id添加到10000。您不需要创建实际的字段。

class Example(models.Model): 
    @property 
    def custom_id(self): 
     return self.id + 10000 
+0

我想制作一个自定义ID字段。 –

+0

如果自定义字段是其他字段的无状态函数,那么属性是个好主意。但是,如果需要单独更新并将其保存到数据库中,则覆盖模型的保存方法即可。 – Kevin

相关问题