いくつかのデータベースオブジェクトを連結した文字列でフィルタリングしたいと思います。Django ORM:余分な属性でフィルタ
通常のSQLクエリは次のようになります。私も、私のモデルでこれを構成し
class PersonObjects(Manager):
attrs = {
'fullName': "CONCAT(firstName, ' ', name)"
}
def get_query_set(self):
return super(PersonObjects, self).get_query_set().extra(
select=self.attrs)
:
objects = managers.PersonObjects()
SELECT concat(firstName, ' ', name) FROM person WHERE CONCAT(firstName, ' ', name) LIKE "a%";
をモデルでは、私は、管理者がPersonObjectsと呼ばれる作成しました
fullNameにアクセスすると、単一オブジェクトの場合に機能します。
>>> p = models.Person.objects.get(pk=4)
>>> p.fullName
u'Fred Borminski'
しかし、それはフィルターでは動作しません:
>>> p = models.Person.objects.filter(fullName__startswith='Alexei')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter
return self.get_query_set().filter(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1128, in add_q
can_reuse=used_aliases)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1026, in add_filter
negate=negate, process_extras=process_extras)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1191, in setup_joins
"Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'fullName' into field. Choices are: firstName, gender, name, (...)
が、これはバグや機能ですか?これをどうすれば解決できますか?
ありがとうございました。
残念ながら、これは機能しません。それでも、fullName属性が見つからないという不満があります。しかし、オブジェクトからfullName属性を取得することは、直接動作します。この 'extra'メソッドは、以前に設定された余分な属性を何らかの方法で上書きしますか? –
これは実際には動作しません: 'models.Person.objects.extra(select = {'fullName':" CONCAT(firstName、 '、name) "}、where = [' fullName LIKE%s ']、params = ['Alexei%']) '(これは 'where句'の中に" Unknown column 'fullName'をスローします) –
三重コメントをおかけして申し訳ありません。この現象はDjangoがfullNameをエイリアスはMySQLでは動作しませんが、HAVING節で動作しますが、これはDjangoでサポートされていないようですが、代わりに次の(あまり美しくない)妥協点を使用しています。 Persons.objects.extra(ここで= ["CONCAT(firstName、 ''、name)LIKE%s]、params = ['Alexei%'])'。 –