13

私は次のモデルを持っています:

class Work(models.Model):
    visible = models.BooleanField(default=False)

class Book(models.Model):
    work = models.ForeignKey('Work')    

次のようにいくつかの行を更新しようとしています:

qs=Work.objects.all()
qs.annotate(Count('book')).filter(Q(book__count__gt=1)).update(visible=False)

ただし、これによりエラーが発生します。

DatabaseError: subquery has too many columns LINE 1: ...SET "visible" = false WHERE "app_work"."id" IN (SELECT...

update 句を削除すると、クエリは問題なく実行され、期待どおりの結果が返されます。

このエラーは、注釈の後に更新が続くクエリで発生するようです。これを書く他の方法はありますか?

4

4 に答える 4

11

問題を再現して解決策を試すことができるようにおもちゃのデータベースを作成しなくても、少なくともDjangoでのアプローチを提案できます。

このアプローチを試してください:

qs.annotate(Count('book')).filter(Q(book__count__gt=1))
Work.objects.filter(pk__in=qs.values_list('pk', flat=True)).update(visible=False)
于 2012-11-26T07:01:00.650 に答える
1

私はこの問題を再現しましたが、これは Django ORM のバグであると考えています。@acjayの回答は良い回避策です。バグレポート: https://code.djangoproject.com/ticket/25171

Django 2 アルファでリリースされた修正: https://code.djangoproject.com/ticket/19513

于 2015-07-23T20:35:43.543 に答える