3

私は持っている

class Achievement(MyBaseModel):
    pass

class Alias(MyBaseModel):
    achievements = models.ManyToManyField('Achievement')

>>> ach = Achievement.objects.all()[1]

これは機能します:

>>> Alias.objects.all().filter(achievements__pk__contains=ach.pk).count()
77L

しかし、これはしません:

>>> Alias.objects.all().filter(achievements__contains=ach).count()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/var/home/ptarjan/django/mysite/django/db/models/query.py", line 489, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/var/home/ptarjan/django/mysite/django/db/models/query.py", line 507, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/var/home/ptarjan/django/mysite/django/db/models/sql/query.py", line 1258, in add_q
    can_reuse=used_aliases)
  File "/var/home/ptarjan/django/mysite/django/db/models/sql/query.py", line 1201, in add_filter
    self.where.add((alias, col, field, lookup_type, value), connector)
  File "/var/home/ptarjan/django/mysite/django/db/models/sql/where.py", line 48, in add
    params = field.get_db_prep_lookup(lookup_type, value)
  File "/var/home/ptarjan/django/mysite/django/db/models/fields/related.py", line 156, in get_db_prep_lookup
    raise TypeError, "Related Field has invalid lookup: %s" % lookup_type
TypeError: Related Field has invalid lookup: contains

なんで?(ジャンゴ 1.0.2)

クエリ ログを見ると、予期しないことを行っています。そのクエリは以下をもたらしました:

>>> connection.queries[-1]
{'time': '0.027', 'sql': u'SELECT COUNT(*) FROM `yourock_alias` INNER JOIN `yourock_achiever` ON (`yourock_alias`.`id` = `yourock_achiever`.`alias_id`) WHERE `yourock_achiever`.`achievement_id` LIKE BINARY %j0xvw9% '}

しかし、これを行う

>>> Alias.objects.all().filter(achievements=ach).count()
77L

このクエリを与える

>>> connection.queries[-1]
{'time': '0.023', 'sql': u'SELECT COUNT(*) FROM `yourock_alias` INNER JOIN `yourock_achiever` ON (`yourock_alias`.`id` = `yourock_achiever`.`alias_id`) WHERE `yourock_achiever`.`achievement_id` = j0xvw9 '}

これは私が望んでいたことですが、私にはそれが唯一=のオブジェクトであることを意味しているように思えます。django が実際に実行しているクエリは、オブジェクトが実績リストのどこかにある場合に返されます。

これは正しく設定されており、非常に直感に反していますか、それとも何か間違っていますか?

4

2 に答える 2

2

なぜこのように実装するという設計上の決定が下されたのか、私には答えられませんが、おそらく、暗示ではなく明示的に指定する必要があるという Python の哲学に従っている可能性があります。

機能しない理由は、__contains が参照するフィールドを想定しているためです。あなたが渡したビットは、オブジェクト全体への参照でした。

于 2009-07-16T09:31:46.437 に答える
1

2 番目のケースでは、オブジェクトを比較しています。また、Django documentationから、オブジェクトを比較するには、==演算子を使用する必要があります。

それに加えて、マニュアルach.alias_set.objects.count()のクエリセクションで説明されているように、を使用しないのはなぜですか?

于 2009-07-16T11:10:53.430 に答える