尝试在Django中迁移数据库时获取TypeError

时间:2016-05-09 17:56:53

标签: python django django-models

我目前正在尝试自动生成ID号并将其作为默认值存储在数据库中:

class EmployeeProfile(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    def generate_id(self):
        first_initial = self.first_name[0].upper()
        second_initial = self.last_name[0].upper()
        id_number = first_initial + second_initial + str(random.randint(1000000, 9999999))

        if not EmployeeProfile.objects.filter(employee_id=id_number).exists():
            return id_number

    employee_id = models.CharField(unique=True, max_length=11, default=generate_id)

我得到的是" TypeError:generate_id()缺少1个必需的位置参数:' self'"。我查看了Django文档https://docs.djangoproject.com/en/1.9/ref/models/fields/#default,它说我可以使用callable作为模型中的默认值,这就是我所做的,但是当我尝试使用时,我遇到了这种类型的错误迁移数据库。我有什么想法我做错了吗?

2 个答案:

答案 0 :(得分:0)

我尝试了一些东西,这似乎很好地迁移了:

class EmployeeProfile(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

def generate_id():
    first_initial = 'a'
    second_initial = 'b'
    id_number = 2
    return id_number

employee_id = models.CharField(unique=True, max_length=11, default=generate_id)

所以看起来你无法将“self”传递给generate_id()。

您以后不能在视图中添加employee_id吗?这就是我做的方式。如果你这样做,你可以在保存之前编辑值:

if form.is_valid():
    instance = form.save(commit=False)
    instance.employee_id = <STUFF>
    instance.save()
    messages.success(request, "Stamp changes saved.")
    return HttpResponseRedirect(instance.get_absolute_url())

编辑:我尝试了更多的东西,你可以尝试从generate_id()中删除self,然后迁移,然后重新添加。它似乎工作。甚至之后修改模型并再次迁移也没有问题。

答案 1 :(得分:0)

感谢用户thebjorn,我只需要覆盖save方法,而不是尝试调用方法。

def save(self):
    first_initial = self.first_name[0].upper()
    second_initial = self.last_name[0].upper()
    id_number = first_initial + second_initial + str(random.randint(1000000, 9999999))

    if not EmployeeProfile.objects.filter(employee_id=id_number).exists():
        self.employee_id = id_number
        super(EmployeeProfile, self).save()