在django中使用条件注解时出错:选择\格式

pxy2qtax  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(405)

当试图注解查询集时,我从django方法得到一个typeerror。我在ubuntu上使用的是Django1.11.12和MySQL5.7.22。
这是我的模型.py:

  1. class Group(models.Model):
  2. name = models.CharField(max_length=100)
  3. class ActivationRecord(models.Model):
  4. group = models.ForeignKey('directory.Group')
  5. year = models.PositiveIntegerField()

如果一个团体在某一年有记录,它就是“活跃的”。我正在尝试使用以下查询注解组是否处于活动状态:

  1. Group.objects.annotate(active=Case(
  2. When(activationrecord__year=2018, then=True), default=False, output_field=BooleanField))

当我运行时,会出现以下错误:

  1. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/query.py", line 226, in __repr__
  2. data = list(self[:REPR_OUTPUT_SIZE + 1])
  3. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/query.py", line 250, in __iter__
  4. self._fetch_all()
  5. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/query.py", line 1118, in _fetch_all
  6. self._result_cache = list(self._iterable_class(self))
  7. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/query.py", line 53, in __iter__
  8. results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  9. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 877, in execute_sql
  10. sql, params = self.as_sql()
  11. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 429, in as_sql
  12. extra_select, order_by, group_by = self.pre_sql_setup()
  13. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 46, in pre_sql_setup
  14. self.setup_query()
  15. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 37, in setup_query
  16. self.select, self.klass_info, self.annotation_col_map = self.get_select()
  17. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 227, in get_select
  18. sql, params = self.compile(col, select_format=True)
  19. File "/home/vagrant/Envs/think/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 375, in compile
  20. return node.output_field.select_format(self, sql, params)
  21. TypeError: select_format() missing 1 required positional argument: 'params'
nsc4cvqm

nsc4cvqm1#

@莱梅泽尔的回答确实解决了这个问题。
另一种方法是使用 Exists 子查询:

  1. from django.db.models import Exists, OuterRef
  2. Group.objects.annotate(
  3. active=Exists(
  4. ActivationRecord.objects.filter(year=2018, group=OuterRef('pk'))
  5. )
  6. )

这基本上Map到sql查询:

  1. SELECT `group`.*, EXISTS(
  2. SELECT U0.*
  3. FROM `activationrecord` U0
  4. WHERE (U0.`group` = (`group`.pk)
  5. AND U0.`year` = 2018)
  6. ) AS `active`
  7. FROM `group`
展开查看全部
deyfvvtc

deyfvvtc2#

BooleanField 需要作为函数调用,使用 () ```
Group.objects.annotate(active=Case(
When(activationrecord__year=2018, then=True),
default=False, output_field=BooleanField()))

相关问题