You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行Django migrate时出现AttributeError: 'bool'对象无startswith属性

Django migrate报错:AttributeError: 'bool' object has no attribute 'startswith'

问题描述

执行python manage.py migrate时触发错误,迁移文件已生成但无法完成迁移,删除旧迁移文件重新执行也无效。

模型代码

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Category(models.Model):
    slug = models.SlugField()
    title = models.CharField(max_length=255, db_index=True)
 
class MenuItem(models.Model):
    title = models.CharField(max_length=255, db_index=True)
    price = models.DecimalField(max_digits=6, decimal_places=2, db_index=True)
    featured = models.BooleanField(db_index=True, default=False)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
 
 
class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    menuitem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    quantity = models.SmallIntegerField()
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    price = models.DecimalField(max_digits=6, decimal_places=2)
 
    class Meta:
        unique_together = ('menuitem', 'user')
  
class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    delivery_crew = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='delivery_crew', null=True)
    status = models.BooleanField(db_index=True, default=False)
    total = models.DecimalField(max_digits=6, decimal_places=2)
    date = models.DateField(db_column=True)
 
class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    menuitem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    quantity = models.SmallIntegerField()
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    class Meta:
        unique_together = ('order', 'menuitem')

完整错误信息

File "C:\Users\USER\Desktop\Little_lemon_capstone\LittleLemon\manage.py", line 22, in <module>
    main()
File "C:\Users\USER\Desktop\Little_lemon_capstone\LittleLemon\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\__init__.py", line 440, in execute       
    self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\base.py", line 402, in run_from_argv     
    self.execute(*args, **cmd_options)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\base.py", line 448, in execute
    output = self.handle(*args, **options)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\base.py", line 96, in wrapped
    res = handle_func(*args, **kwargs)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\core\management\commands\migrate.py", line 349, in handle    
    post_migrate_state = executor.migrate(
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\migrations\executor.py", line 135, in migrate
    state = self._migrate_all_forwards(
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\migrations\executor.py", line 167, in _migrate_all_forwards
    state = self.apply_migration(
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\migrations\executor.py", line 252, in apply_migration 
    state = migration.apply(state, schema_editor)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\migrations\migration.py", line 130, in apply
    operation.database_forwards(
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\migrations\operations\models.py", line 96, in database_forwards
    schema_editor.create_model(model)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\backends\base\schema.py", line 444, in create_model   
    sql, params = self.table_sql(model)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\backends\base\schema.py", line 249, in table_sql      
    self.quote_name(field.column),
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\backends\base\schema.py", line 202, in quote_name     
    return self.connection.ops.quote_name(name)
File "C:\Users\USER\.virtualenvs\littlelemon-DilRqmD_\lib\site-packages\django\db\backends\sqlite3\operations.py", line 190, in quote_name
    if name.startswith('"') and name.endswith('"'):
AttributeError: 'bool' object has no attribute 'startswith'

问题根源及解决方法

  • 问题出在Order模型的date字段:db_column=True是错误写法,db_column参数要求传入字符串类型的数据库列名,而非布尔值。
  • 修复方式二选一:
    1. 无需自定义列名时,直接删除db_column=True,Django会默认使用字段名date作为列名:
      date = models.DateField()
      
    2. 需要自定义列名时,传入字符串形式的列名,例如:
      date = models.DateField(db_column='order_date')
      
  • 修复完成后,重新执行以下命令完成迁移:
    python manage.py makemigrations
    python manage.py migrate
    

内容的提问来源于stack exchange,提问作者ariesTobells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:57:24