有没有"正确"的方法将django.db.models.query.ValuesListQuerySet转换为纯List?

Dan*_*anH 12 django django-models

我试图在一个方法中删除多个模型中的记录,我有以下架构:

picture 1:1 picture_foreign_picture *:1 picture_foreign
Run Code Online (Sandbox Code Playgroud)

我正在删除这些给定列表picture_foreign对象:

picture_foreign_pictures = PictureForeignPicture.objects.filter(picture_foreign__in=picture_foreigns)
picture_ids = picture_foreign_pictures.values_list('picture_id', flat=True)
logger.warn('PICTURES REMOVE: %s' % picture_ids)
picture_foreign_pictures.delete()
logger.warn('PICTURES REMOVE: %s' % picture_ids)
Run Code Online (Sandbox Code Playgroud)

2个记录器行输出以下内容:

WARNING 2013-01-02 03:40:10,974 PICTURES REMOVE: [86L]
WARNING 2013-01-02 03:40:11,045 PICTURES REMOVE: []
Run Code Online (Sandbox Code Playgroud)

尽管如此,图片86仍然存在:

mysql> select id from picture where id = 86;
+----+
| id |
+----+
| 86 |
+----+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我想我可以通过简单地转换picture_ids成纯整数列表来解决这个问题但是我想知道是否有更多的Django方法呢?我flat=True原本以为它已经处理好了,但它似乎不仅仅是一个纯粹的清单.

Dan*_*anH 27

好吧,我不确定它是否正确,但使用它list()来实现这个目标非常简单:

picture_ids = list(picture_foreign_pictures.values_list('picture_id', flat=True))
Run Code Online (Sandbox Code Playgroud)

  • 上面的操作引发了一个错误:参数错误: (6认同)
  • @Arun使用pdb调试时,出现了***参数错误错误,因为pdb覆盖了关键字list。在“现实世界”中,此解决方案有效。 (2认同)

小智 5

上面的解决方案不起作用:

您可以像这样转换为采购清单:

p_ids =PictureForeignPicture.objects.filter(picture_foreign__in=picture_foreigns).values_list('picture_id', flat=True)

new_list = [];new_list.extend(p_ids)
Run Code Online (Sandbox Code Playgroud)