用django做一个查询页面,在查询指定category的产品时候,
python">skus = category.sku_set.filter(is_launched=True).order_by(sort_field)
没查到结果:
skus: Unable to get repr for <class 'django.db.models.query.QuerySet'>
检查了下MySQL数据库是有数据的,代码也是正确的,网络也正常。
解决思路:
根据错误提示,模型类没有响应,那么就是数据库的数据无法通过模型类展现出来,MySQL的数据类型或格式与model应该是不匹配。
MySQL里面的数据是提前检查,导入好的,那么就看model.py文件定义sku这个类有没字段定义错了类型。
python">default_image_url = models.CharField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')
对应MySQL表的字段,发现default_image_url这个字段在MySQL表中的字段是default_image。而且商品不仅包含文字信息,也包含图片,明显这个代表图片的字段定义为charfield是错的。于是改为如下:
python">default_image = models.ImageField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')
改完在终端进行模型类迁移,输入python manage.py makemigrations和python manage.py migrate.报错了
Running migrations:
Applying goods.0002_auto_20220220_1055...Traceback (most recent call last):……
pymysql.err.OperationalError: (1091, "Can't DROP 'default_image_url'; check that column/key exists")
django.db.utils.OperationalError: (1091, "Can't DROP 'default_image_url'; check that column/key exists")
解决方法:
打开goods子应用的migrations/0002_auto_20220220_1055迁移文件,注释掉删除、添加字段那一段
python">class Migration(migrations.Migration):
dependencies = [
('goods', '0001_initial'),
]
operations = [
# migrations.RemoveField(
# model_name='sku',
# name='default_image_url',
# ),
# migrations.AddField(
# model_name='sku',
# name='default_image',
# field=models.ImageField(blank=True, default='', max_length=200, null=True, upload_to='', verbose_name='默认图片'),
# ),
]
因为MySQL表中的字段就是default_image,在数据库中删除name是default_image_url的字段,再添加一个default_image字段,这个操作会找不到default_image_url的,所以会报错。注释后重新运行上面两条迁移指令,成功了。这一次能够拿到查询集数据。
总结:
1.django的文档还是要看的。我一开始纠结default_image改为ImageField,但是MySQL里存的数据是字符串的,不对应啊。后来看文档才知道ImageField是继承自CharField,并多了图片长宽度属性,验证上传的对象是否图像的功能。而且ImageField实例是在数据库创建一个varchar类型的字段,疑惑消除了。
2.学代码要弄懂底层原理,不能只关注如何实现业务逻辑。