在Django个人资料模型中创建人员代码

时间:2019-06-10 11:43:45

标签: python django django-models django-queryset django-2.2

我想为我的用户创建唯一的人员代码。我应该在这段代码中考虑这种模式:

  1. 代码长度:7位数字。
  2. 第一个字符从左侧开始:从USER_TYPEuser_type_code
  3. 接下来的两个字符:当前年份示例-19为2019年:year_code
  4. 剩余四个char。创建为count_code

我编写了整个生成,但由于此错误而无法正常工作:

AttributeError: Manager isn't accessible via Profile instances

这是我的个人资料模型和生成器:

class Profile(models.Model):
    USER_TYPE = (
    (1, 'student'),
    (2, 'teacher'),
    (3, 'co-worker'),)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    Personnel_code = models.PositiveIntegerField(null=True, blank=True)
    created_date = models.DateField(editable=False)
    user_type = models.CharField(max_length=10, default=USER_TYPE[0][0],choices=USER_TYPE)

    def personnel_code_generator(self):
        user_type_code = self.user_type
        year_code = datetime.datetime.now().strftime("%y")
        last_user = self.objects.latest('created_date')
        year_user = self.objects.filter(created_at__year=datetime.datetime.now().year)
        if year_user == 0:
            count_code = '0001'
        else:
            count_code = str(int(last_user.Personnel_code) + 1)[3:]
        generated_id = int(str(user_type_code) + str(year_code) + count_code)
        return generated_id

    def save(self, *args, **kwargs):
        if not self.id or not self.created_date:
            self.personnel_code = self.personnel_code_generator()
            self.created_date = datetime.datetime.now()
        super(Profile, self).save(*args, **kwargs)

1 个答案:

答案 0 :(得分:1)

就像错误所述一样,您不能通过objects 对象访问Profile管理器。您应该通过Profile class 进行访问,例如:

def personnel_code_generator(self):
    user_type_code = self.user_type
    year_code = datetime.datetime.now().strftime("%y")
    year_users = Profile.objects.filter(created_at__year=datetime.datetime.now().year)
    if not year_user:
        count_code = '0001'
    else:
        last_user = Profile.objects.latest('created_date')
        count_code = str(last_user.Personnel_code + 1)[3:]
    return int(str(user_type_code) + str(year_code) + count_code)