【问题标题】:invalid literal for int() with base 10: - django - python以 10 为基数的 int() 的无效文字:-django-python
【发布时间】:2017-08-18 15:29:35
【问题描述】:

我试图在创建新闻时自动选择新闻的作者。

这是我的代码:

型号:

from django.db import models
from ckeditor.fields import RichTextField
from django.contrib.auth.models import User

# Create your models here.

class News(models.Model):
    news_title = models.CharField(max_length=420, help_text="Insert only the news title, be specific and short!")
    pub_date = models.DateTimeField('date published')
    article_text = RichTextField()
    news_author = models.CharField(User, max_length=250, editable = False, default='unknown')

    class Meta:
        ordering = ["news_title", "-pub_date"]
        verbose_name = "News"
        verbose_name_plural = "News"

    def get_absolute_url(self):
        return reverse('model-detail-view', args[str(self.id)])

    def __str__(self):
        return self.news_title

管理员:

from django.contrib import admin

# Register your models here.

from .models import News


admin.site.site_header = "SoLS UCP Admin Panel"

class NewsAdmin(admin.ModelAdmin):
    list_display = ('news_title', 'pub_date', 'news_author')

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'news_author', None) is None:
            obj.news_author = request.user
        obj.save()

admin.site.register(News, NewsAdmin)

问题是我给作者设置了 null = True 并且数据库搞砸了旧新闻,所以我删除并对其应用了默认值但我得到了这个错误..所以我直接从 phpmyadmin 删除了所有旧新闻,但是没有成功,错误依然存在:

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

在此之前还有更多:

  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\core\management\__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\core\management\__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\core\management\base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle
    fake_initial=fake_initial,
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\migrations\executor.py", line 115, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\migrations\executor.py", line 145, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\migrations\migration.py", line 129, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\migrations\operations\fields.py", line 216, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\backends\base\schema.py", line 515, in alter_field
    old_db_params, new_db_params, strict)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\backends\base\schema.py", line 613, in _alter_field
    new_default = self.effective_default(new_field)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\backends\base\schema.py", line 229, in effective_default
    default = field.get_db_prep_save(default, self.connection)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\models\fields\related.py", line 963, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\models\fields\__init__.py", line 770, in get_db_prep_save
    prepared=False)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\models\fields\__init__.py", line 958, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Users\andrei\Envs\sols-ucp\lib\site-packages\django\db\models\fields\__init__.py", line 966, in get_prep_value
    return int(value)

此外,如果我尝试访问模型页面,我会收到此错误 (1054, "Unknown column 'catalog_news.news_author' in 'field list'")

【问题讨论】:

  • 在 request.user 你有字符串或用户对象?执行哪个命令后会出现此错误?你做了python manage.py migrate吗?
  • @VladyslavUshakov 那是我收到错误的时候

标签: python django django-models


【解决方案1】:

您的模型显示news_author = models.CharField,但错误表明您在某个阶段使用了news_author = models.ForeignKey(User)。使用外键通常更好,我将其命名为author = models.ForeignKey(User),因为您不必在模型中重复news

您现在发现数据库和模型文件不匹配,修复它可能会很棘手。如果您正在开发并且数据库中没有任何重要数据,最简单的方法是删除迁移,重新创建数据库,然后再次运行 makemigrationsmigrate

【讨论】:

  • 这样做了,我得到了同样的错误,当我做python manage.py migrate时我得到了那个错误@
  • 我删除了整个数据库并做了makemigrations并再次迁移,我得到同样的错误,我需要从文件夹中删除这些迁移吗?
  • 是的,当我在上面说“删除迁移”时,我的意思是从News 模型所在的应用程序中删除迁移文件。
【解决方案2】:

我认为您应该停止迁移,将这些命令运行到项目路径中的命令行(终端)中:

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

之后再次迁移您的项目:

python manage.py makemigrations APP_NAME
python manage.py migrate

您在迁移数据库时注意,您的数据库不会在数据库查看器等其他应用程序中打开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2023-03-09
    • 2012-07-08
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多