gpt4 book ai didi

Django:为什么外键查找不自动使用 pk?

转载 作者:行者123 更新时间:2023-12-01 15:03:51 25 4
gpt4 key购买 nike

我有

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 正在执行的查询实际上是返回。

这个设置是否正确并且非常违反直觉,还是我做错了什么?

最佳答案

我无法回答为什么设计决定以这种方式实现它,但很可能它遵循 Python 哲学,即事物应该明确指定而不是暗示。

它不起作用的原因是因为 __contains 需要引用一个字段。您传递给它的位是对整个对象的引用。

关于Django:为什么外键查找不自动使用 pk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com