如何使用另一个查询作为可能值,通过GenericForeignKey-Field过滤查询?

时间:2015-01-06 04:55:32

标签: django django-models django-templates django-queryset

我有两个应用程序:一个简单的消息应用程序和一个给予积分的评级应用程序。

这些点是仅具有通用外键的模型,并且根据存在的外键数量,有一个值分配给我想要的所有内容。

class Point(models.Model):
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = GenericForeignKey('content_type', 'object_id')
  user = models.ForeignKey('auth.User')

现在我正在努力解决这个问题:我有一系列的事情,例如:消息:

class Message(models.Model):
  subject = models.CharField(max-length=255)
  body = models.TextField()


things = Point.objects.all()

所以现在的目标是按每个对象的指定点数对其进行排序。使用相关的查询名称非常容易。但是我的消息应用程序将完全取决于点应用程序。

这就是我更喜欢仅使用模板标签来解决这个问题的原因。我正在考虑将'things'传递给模板标记,然后按点对这个查询集进行排序。看起来应该是这样的:

@register.simple_tag()
def get_points_for_query(q):
  points = Point.objects.filter(content_object__in=q).prefetch_related('content_obj').order_by('pk')
  return points

当然这不起作用,因为通用外键不能与“__in”一起使用。但是如果我遍历Queryset并调用:

for obj in q:
  ct = ContentType.objects.get_for_model(obj)

这将为我的服务器带来很多工作。有没有办法为查询获取一次内容类型?我只打算给那个只查询单一类型内容的标签提供查询。或者有没有更好的方法来解决这个问题,而不会让这些应用程序相互依赖?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以获取查询集的模型,然后针对该特定内容类型过滤Point

@register.simple_tag()
def get_points_for_query(q):
    ct = ContentType.objects.get_for_model(q.model)
    return Point.objects.filter(content_type=ct, object_id__in=q) \
                        .prefetch_related('content_obj').order_by('pk')

我不确定object_id__in=q条款。如果它不起作用,请尝试:

object_id__in=q.values_list('id', flat=True)

这应该可以正常工作。