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')

如何获取 A 实例,通过其参数与一些 B 实例链接。我尝试这样做:

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)

没有错误:«Cannot resolve keyword 'object_id' into field。» 我可以通过链接 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

请注意,我使用所有查询构建了一个 qset,而不是为循环中的每个步骤调用 retreive b_with_a。如果它不符合您的目的,请更改它。

于 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 回答