Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有if条件的Django自定义ID字段_Django_Django Models_Django Views_Django Forms_Django Templates - Fatal编程技术网

带有if条件的Django自定义ID字段

带有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

我将在每个新注册运动员中设置名为“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

  • Models.py

    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?我认为这比计数好,因为计数有问题,如果我在注册时删除了以前的记录,新记录将生成与上次记录相同的重复编号。更新检查,如果答案正确,则更新。虽然我没有检查解决方案,但会尽快测试。你是伟大的大卫!它正在工作,但第一条记录在尝试从数据库获取最后一条记录时出现了一个小问题。它没有显示错误的记录,如果数据库中有成员编号,它的工作正常。编辑第二部分,测试它。请友好地投票给我的答案,因为我付出了一些努力来解决它:因为没有最后一条记录,所以在第一条记录上查找最后一条()是错误的。