unable to get repr for <class ‘django.db.models.query.QuerySet

在使用Django查询特定category产品时遇到错误:Unable to get repr for <class 'django.db.models.query.QuerySet'>。问题源于数据库字段default_image_url与model中定义的default_image不匹配。通过修改model.py将default_image_url字段改为default_image并进行迁移,但出现OperationalError。解决方案是注释掉migrations文件中涉及该字段的更改,手动在MySQL中调整字段,然后重新迁移,成功获取查询集数据。学习Django时应注意文档学习和理解底层原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用django做一个查询页面,在查询指定category的产品时候,

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这个类有没字段定义错了类型。

default_image_url = models.CharField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')

对应MySQL表的字段,发现default_image_url这个字段在MySQL表中的字段是default_image。而且商品不仅包含文字信息,也包含图片,明显这个代表图片的字段定义为charfield是错的。于是改为如下:

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迁移文件,注释掉删除、添加字段那一段

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.学代码要弄懂底层原理,不能只关注如何实现业务逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值