【问题标题】:Django Migrations producing weird errorsDjango Migrations 产生奇怪的错误
【发布时间】:2016-03-15 22:38:06
【问题描述】:

我正在尝试创建一个彩票应用程序,它一直运行良好,但是今天当我尝试执行 python manage.py migrate lotteryapp 时,它开始产生一个错误,指出

django.db.utils.OperationalError: (1060, "Duplicate column name 'email'")

所以我删除了电子邮件的所有引用,看看是否可以修复它,但它仍然给出错误。然后我一起删除了数据库并重新开始,但它给出了这个错误

ValueError: invalid literal for int() with base 10: ''

我已经进入了我的 models.py 文件并退出并再次运行该命令,它再次给出了重复列错误。这没有任何意义。这是我在 models.py 中的代码:

from django.db import models
from django.utils import timezone
from datetime import datetime

class Lottery(models.Model):
    name = models.CharField(default="", max_length=50)
    date_drawn = models.DateTimeField(default=datetime.now,blank=True)
    win_amount = models.IntegerField(default=0)
    winning_numbers = models.IntegerField(default="")
    def __unicode__(self):
        return self.name

class Winner(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    winner_telephone = models.IntegerField(max_length=15, default="")
    lottery_numbers = models.IntegerField(default=0)
    lottery_won = models.CharField(max_length=50, default="") 
    def __unicode__(self):
        return self.name

class User(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    telephone = models.IntegerField(default="")
    def __unicode__(self):
        return self.first_name

class entered_user(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    telephone = models.IntegerField(default="")
    lottery_numbers = models.IntegerField(default="")
    def __unicode__(self):
        return self.first_name

【问题讨论】:

  • 我现在已经从 mysql 中的 enter_user 表中删除了 email 列(我不知道它为什么或如何在那里)并且我再次运行了迁移,现在我得到了 ValueError : 以 10 为基数的 int() 的无效文字:再次出现“错误”。此外,每当我执行 python manage.py makemigrations lotteryapp 时,它都会在数据库中的 enter_user 表中添加一个电子邮件列,尽管它们在 models.py 中没有引用电子邮件
  • 我现在已经让它进入​​工作状态,但我没有找到问题的原因。我必须完全删除数据库和输入的用户模型以及删除所有迁移并重新启动它。

标签: python mysql sql django django-models


【解决方案1】:

问题在于字段lottery_wonlottery_numbers。将默认值更改为 0,然后重试。

【讨论】:

  • 您是否更改了winning_numbers、winner_telephone、电话和相关字段。如果我们尝试将字符串转换为整数,则会出现问题ValueError: invalid literal for int() with base 10: ''。如果创建了任何迁移,请移除并重试
  • 我现在已经修复了,我认为我的数据库和迁移有问题,所以我删除了两者并重新启动了数据库。感谢您的帮助
【解决方案2】:
  1. IntegerField 不能有 default 字符串类型,也没有属性 ma​​x_length

    • winning_numbers = models.IntegerField(default="")
    • winner_telephone = models.IntegerField(max_length=15, default="")
    • telephone = models.IntegerField(default="")
    • lottery_numbers = models.IntegerField(default="")
  2. 避免调用您的模型用户,因为它可能会导致与默认的 django 用户模型冲突,这可能是电子邮件错误消息的原因。

@CNB 我尝试了如下代码我只是将 User 更改为 UserModel 并且迁移工作正常:

from __future__ import unicode_literals
from django.db import models
from django.db import models
from django.utils import timezone
from datetime import datetime

class Lottery(models.Model):
   name = models.CharField(default="", max_length=50)
   date_drawn = models.DateTimeField(default=datetime.now,blank=True)
   win_amount = models.IntegerField(default=0)
   winning_numbers = models.IntegerField(default=0)
   def __unicode__(self):
       return self.name

class Winner(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    winner_telephone = models.IntegerField(default="")
    lottery_numbers = models.IntegerField(default=0)
    lottery_won = models.CharField(max_length=50, default="")
    def __unicode__(self):
        return self.name

class UserModel(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    telephone = models.IntegerField(default=0)
    def __unicode__(self):
        return self.first_name

class entered_user(models.Model):
    first_name = models.CharField(max_length=100, default="")
    last_name = models.CharField(max_length=100, default="")
    telephone = models.IntegerField(default=0)
    lottery_numbers = models.IntegerField(default=0)
    def __unicode__(self):
        return self.first_name

【讨论】:

  • 我现在已将 default="" 删除为 default=0 并且 User 现在是 Lottery_User 但我仍然遇到同样的问题。这很烦人,因为我运行迁移并得到无效的文字错误,然后我再次运行它并得到重复的列错误。我的模型文件中的任何地方都没有电子邮件,那么它是如何添加的?!
  • 正如我所提到的,尝试通过 Profile 或任何其他名称更改 User 模型,因为我认为它与 django 默认用户模型发生冲突其中有一个电子邮件字段。删除您的数据库,然后重试。
  • 我在之前的评论中提到我已经这样做了,我也删除了数据库
  • 检查我刚刚分享的sn-p
  • 我现在已经修复了,我认为我的数据库和迁移有问题,所以我删除了两者并重新启动了数据库。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2012-06-08
  • 2020-11-18
  • 2021-06-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多