1
class A(models.Model):
    pass

class B(models.Model):
    a = models.ForeignKey(A)
    content_type = models.ForeignKey(ContentType)
    object_id = models.IntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

パラメータによっていくつかの B インスタンスにリンクされた A インスタンスを取得する方法。私はそれをしようとします:

instances = { '1':10, '2':20, '3':30 }
for ct, id in instances.items():
qset |= Q(content_type=int(ct), object_id=int(id))
a = A.objects.all().select_related().filter(qset)

次のエラーで機能しません: «キーワード 'object_id' をフィールドに解決できません。» リンクされた B によって A を取得できるものは何ですか?

ありがとう!

[PS] これで動作しますが、本来の動作とは言えません:

a_all = A.objects.all()
for a in a_all:
    print a.a_set.filter(qset)
4

2 に答える 2

0

代わりに B でフィルタリングし、B から A インスタンスを取得します。

instances = { '1':10, '2':20, '3':30 }

for ct, id in instances.items():
    qset = qset | Q(content_type=int(ct), id=int(id))

b_with_a = B.objects.select_related().filter(qset)

for each b in b_with_a:
    print b.A.what_ever_field

ループ内のすべてのステップで b_with_a を取得する呼び出しを行う代わりに、すべてのクエリで 1 つの qset を構築することに注意してください。目的に合わない場合は変更してください。

于 2012-06-01T10:56:42.070 に答える
-1

リレーションシップにまたがるルックアップを使用できます

import operator
instances = { '1':10, '2':20, '3':30 }
# note the 'b__'
qset = reduce(operator.or_, (Q(b__content_type=int(x), b__object_id=y)
                             for x,y in instances.iteritems()))
qs = A.objects.filter(qset)
于 2012-06-02T06:28:14.867 に答える