【问题标题】:Getting TypeError when attempting to migrate database in Django尝试在 Django 中迁移数据库时出现 TypeError
【发布时间】:2016-09-04 11:28:25
【问题描述】:

我目前正在尝试自动生成一个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,它说我可以在模型中使用可调用的默认值,这就是我所做的,但是当我尝试迁移数据库时出现这种类型错误。任何想法我做错了什么?

【问题讨论】:

  • 它可以是可调用对象,但不是模型上的方法(如您所见,无法提供self)。您应该改写 save() 方法。
  • 效果很好。谢谢

标签: python django django-models


【解决方案1】:

感谢用户 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()

【讨论】:

    【解决方案2】:

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

    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,然后迁移,然后将其重新添加。它似乎有效。即使之后修改模型并再次迁移也没有问题。

    【讨论】:

    • 感谢您抽出宝贵时间回答。 thebjorn 说我只需要重写保存功能就可以了。我稍后会在这里发布解决方案。
    • 啊,就像我在中间建议的那样?没问题,我尝试通过阅读其他人的问题并尝试回答其中一些来学习。
    • 是的,你的答案是相似的,但是你保存在视图端,而 thebjorn 的答案保存在模型端。 Bjorn 在您提交答案之前就回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2019-02-14
    • 1970-01-01
    • 2021-05-24
    • 2012-05-24
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多