执行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参数要求传入字符串类型的数据库列名,而非布尔值。 - 修复方式二选一:
- 无需自定义列名时,直接删除
db_column=True,Django会默认使用字段名date作为列名:date = models.DateField() - 需要自定义列名时,传入字符串形式的列名,例如:
date = models.DateField(db_column='order_date')
- 无需自定义列名时,直接删除
- 修复完成后,重新执行以下命令完成迁移:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者ariesTobells
相关产品推荐
相关产品推荐

