Django : 외국 키 조회가 PK를 자동으로 사용하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1136403

문제

나는 가지고있다

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

왜요? (Django 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가 수행하는 쿼리는 실제로 개체가 있으면 돌아오고 있습니다. 어딘가에 업적 목록에서.

이것은 올바르게 설정되었으며 매우 반 직관적이거나 내가 뭔가 잘못하고 있습니까?

도움이 되었습니까?

해결책

두 번째 경우에는 객체를 비교하고 있습니다. 그리고, 장고 문서, 객체를 비교하려면 사용해야합니다. == 운영자.

게다가 : 왜 사용하지 않겠습니까? ach.alias_set.objects.count(),에 설명 된 바와 같이 매뉴얼의 쿼리 섹션?

다른 팁

디자인 결정이 이런 식으로 구현하기로 결정한 이유는 대답 할 수 없지만, 사물을 명시 적으로 명시하고 암시하지 않아야한다는 파이썬 철학을 따라야 할 가능성이 높습니다.

작동하지 않는 이유는 __cratains가 필드를 참조 할 것으로 기대하기 때문입니다. 당신이 통과 한 비트는 전체 객체에 대한 참조였습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top