我有两个应用程序:一个简单的消息应用程序和一个给予积分的评级应用程序。
这些点是仅具有通用外键的模型,并且根据存在的外键数量,有一个值分配给我想要的所有内容。
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)
这将为我的服务器带来很多工作。有没有办法为查询获取一次内容类型?我只打算给那个只查询单一类型内容的标签提供查询。或者有没有更好的方法来解决这个问题,而不会让这些应用程序相互依赖?
感谢您的帮助。
答案 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)
这应该可以正常工作。