在Django模型中创建一个自定义id字段
问题描述:
我试图在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})
答
你可以在你编写自定义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
是必需的,否则将启动递归将会无限地运行。
答
在模型上创建一个属性,将id添加到10000。您不需要创建实际的字段。
class Example(models.Model):
@property
def custom_id(self):
return self.id + 10000
+0
我想制作一个自定义ID字段。 –
+0
如果自定义字段是其他字段的无状态函数,那么属性是个好主意。但是,如果需要单独更新并将其保存到数据库中,则覆盖模型的保存方法即可。 – Kevin
我添加了我的代码。我需要做到这一点,以免它干扰我的其他领域。 –
我已添加注释以详细说明我的代码。它不会干扰你的其他领域。 –
难道你不应该把'* args,** kwargs'传递给super吗? – schillingt