带有if条件的Django自定义ID字段
我将在每个新注册运动员中设置名为“membership_num”的自定义id,递增数字为1,每个记录的前缀如下: 如果模型中的“目标字段”为“健身房”,则应生成ID: 说明:N-年-月-日,然后是数字带有if条件的Django自定义ID字段,django,django-models,django-views,django-forms,django-templates,Django,Django Models,Django Views,Django Forms,Django Templates,我将在每个新注册运动员中设置名为“membership_num”的自定义id,递增数字为1,每个记录的前缀如下: 如果模型中的“目标字段”为“健身房”,则应生成ID: 说明:N-年-月-日,然后是数字 N-G-201207000001 N-G-201207000002 N-G-2012070003 如果模型中的“目标字段”为“适合度”,则应生成ID: 说明:N-健身年-月-日,然后是数字 N-F-201207000001 N-F-201207000002 N-F-2012070003
class Athlete(models.Model):
first_name = models.CharField(max_length=50)
membership_num = models.CharField(max_length=255, blank=True, editable=False)
goal = models.CharField(max_length=10, choices=[('gym', 'Gym'), ('fitness', 'Fitness')])
我在StackOverflow中找到并尝试了以下解决方案,但它没有生成正确的ID
def save(self, *args, **kwargs):
# super().save(*args, **kwargs)
if not self.membership_num:
prefix = 'N{}'.format(timezone.now().strftime('%y%m%d'))
prev_instances = self.__class__.objects.filter(membership_num__icontains=prefix)
if prev_instances.exists():
last_instance_id = prev_instances.last().membership_num[-4:]
self.membership_num = prefix + '{0:04d}'.format(int(last_instance_id) + 1)
else:
self.membership_num = prefix + '{0:04d}'.format(1)
super(Athlete, self).save(*args, *kwargs)
请帮助我…根据您的需求,这里有一个可能的解决方案。这相当简单,所以我认为你不需要解释
def保存(self,*args,**kwargs):
前缀='N-{}-{}'。格式(self.goal[0].upper(),
date.today().strftime(“%y%m%d”))
今天的\u instances=self.\u class\u.objects.filter(membership\u num\u\u icontains=prefix).count()
self.membership_num=前缀+'{0:04d}'。格式(今天的_实例+1)
超级(运动员,自我)。保存(*args,*kwargs)
未测试,但您可以尝试以下方法
从django.core.exceptions导入ObjectDoesNotExist
#........
def保存(自身、*args、**kwargs):
前缀='N-{}-{}'。格式(self.goal[0].upper(),
date.today().strftime(“%y%m%d”))
今天\u实例=0
尝试:
last\u record=self.\uuuuuu class\uuuuuu.objects.filter(membership\u num\uuuuuuuuu icontains=prefix).last()
today_instances=int(最后一条记录。成员人数[-4:])
除ObjectDoesNotExist外:
通过
self.membership_num=前缀+'{0:04d}'。格式(今天的_实例+1)
超级(运动员,自我)。保存(*args,*kwargs)
谢谢“davidm”,但是否可以找到最后一个id并将其递增+1?我认为这比计数好,因为计数有问题,如果我在注册时删除了以前的记录,新记录将生成与上次记录相同的重复编号。更新检查,如果答案正确,则更新。虽然我没有检查解决方案,但会尽快测试。你是伟大的大卫!它正在工作,但第一条记录在尝试从数据库获取最后一条记录时出现了一个小问题。它没有显示错误的记录,如果数据库中有成员编号,它的工作正常。编辑第二部分,测试它。请友好地投票给我的答案,因为我付出了一些努力来解决它:因为没有最后一条记录,所以在第一条记录上查找最后一条()是错误的。