在Django模型中创建自定义id字段

时间:2017-06-29 18:46:29

标签: django django-models

我正在尝试在Django中创建一个具有自定义id属性的模型。我希望它总是等于10000的总和和该实例的当前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 个答案:

答案 0 :(得分:3)

在模型上创建一个向id字段添加10000的属性。您无需创建实际字段。

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

答案 1 :(得分: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是必需的,否则它将启动无限运行的递归。