【问题标题】:django table onlineshop_product has no column named namedjango table onlineshop_product 没有名为 name 的列
【发布时间】:2022-06-16 21:12:06
【问题描述】:

我在 Django 的帮助下从事一个在线购物网站项目。我是 Django 的初学者以下代码提供了我的数据库表。它有助于添加产品。

class Product(models.Model):
    category = models.ForeignKey(Category,related_name='products', on_delete=models.CASCADE)

    name = models.CharField(max_length=200,db_index=True)
    slug = models.SlugField(max_length=200,db_index=True)
    image = models.ImageField(upload_to='products/%y/%m/%d',blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

在浏览器中显示错误。当我在管理面板中添加产品时,此错误会显示给我。它有助于添加产品,但是当我添加产品时会出现以下错误。

/admin/onlineshop/product/add/处的操作错误

表 onlineshop_product 没有名为 name 的列

当我使用命令进行迁移时:

python manage.py migrate

它显示:

要执行的操作:应用所有迁移:admin、auth、 contenttypes、onlineshop、sessions 运行迁移:无迁移 申请。您在应用程序中的模型:“在线商店”有以下变化 尚未反映在迁移中,因此不会应用。跑 'manage.py makemigrations' 进行新的迁移,然后重新运行 'manage.py migrate' 来应用它们。

python manage.py makemigrations

无法使用 'auto_now_add=True' 添加字段 'created' 在不提供默认值的情况下生成产品。这是因为数据库 需要一些东西来填充现有的行。

  1. 现在提供一次性默认值,将在所有现有的 行
  2. 退出并在 models.py 中手动定义默认值。选择 一个选项:

如何解决?

【问题讨论】:

    标签: python django django-models django-migrations


    【解决方案1】:

    这是众所周知的问题,请参考here[django-doc],如果您选择第一个选项会很容易。

    选择第一个选项:

    然后,你会在你的 shell 中看到类似这样的东西:

    Select an option: 1
    Please enter the default value now, as valid Python
    You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
    The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
    Type 'exit' to exit this prompt
    [default: timezone.now] >>>
    

    在这里,只需按 Enter,该字段将被添加到迁移中,您的工作就完成了,然后只需运行 migrate 命令。也可以在migration文件中查看。

    迁移文件

    operations = [
            migrations.AddField(
                ....
                field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
            )
        ]
    

    编辑:

    试试这个:

    name = models.CharField(max_length=200,db_index=True,default='any_name')
    

    然后运行 ​​makemigrations 并迁移。

    【讨论】:

    • 会再次显示It is impossible to add a non-nullable field 'name' to product without specifying a default. This is because the database needs something to populate existing rows. Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Quit and manually define a default value in models.py. Select an option: migrate Please select a valid option:
    • 是的,按 1 然后按 Enter 它将在桌子上进行alter 操作。
    • @pycoder 听着,我没看清楚,是因为你在模型中的name字段中没有给default,不是created字段,加@ 987654333@ 在您的name 字段中,然后它将解决。
    • Hello @pycoder default 如果用户没有提供值,则使用默认值,因为您创建的列没有设置 null=True 这意味着如果将其设置为空,它将引发 sql 错误,因此您可以将 null=True 设置为您的名称字段,或者您可以指定默认值.
    • OperationalError at /admin/onlineshop/product/add/ table onlineshop_product has no column named name - 发生此错误是因为您更改了提交的名称并且您没有运行 makemigrationsmigrations 命令
    【解决方案2】:

    把你的Product(...)类改成这样

    from django.db import models
    from datetime import datetime
    
    class Product(models.Model):
        # ... all other fields
        name = models.CharField(max_length=200, db_index=True, default='Name not provided')
        created = models.DateTimeField(auto_now_add=True, null=True)
        updated = models.DateTimeField(auto_now=True, null=True)
    

    并依次运行这些命令

    python manage.py makemigrations your_app_name # app name is optional parameter if you have app then provide app name
    python manage.py migrate
    

    虽然设置 null = True 是个坏主意,但这暂时可以解决您的问题,但如果您想解决此问题,您可以关注此post 或此answer

    更新

    如果上述解决方案不起作用或遇到一些问题,请这样做

    注意:在这种方法中,您必须删除数据库(sqlite)。

    步骤 - 1

    从您的所有应用中删除 __pycache__migrations 文件夹

    步骤 - 2

    删除 db.sqlite3

    步骤 - 3

    如上所述运行 makemigrations & migrate 命令

    【讨论】:

    • ERRORS: onlineshop.Product.created: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present. onlineshop.Product.updated: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present. 错误与否??
    • @pycoder 是的,这是因为它默认引用django.utils.timezone.now,只为您的name 字段和您的created 字段提供默认值,选择第一个选项将解决问题或否则什么都不会。
    • 你好@pycoder 检查我已经编辑了我的答案更改了createdupdated 字段。
    • 请先运行makemigrations再运行migrate命令
    • @AnkitTiwari 也对,但我不推荐,因为他已经是初学者,如果他不小心忘记删除任何迁移文件,那么他将无法再做任何事情:)。跨度>
    猜你喜欢
    • 2016-12-18
    • 2016-11-12
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多