按Django中的内容对象的值排序
我正在寻找一种优雅的方式来按特定内容对象的字段排序查询集。按Django中的内容对象的值排序
class MyModel(models.Model):
...
content_type = models.ForeignKey(ContentType)
object_pk = models.TextField('object ID')
content_object = generic.GenericForeignKey('content_type', 'object_pk')
我的内容对象是不同的,但他们都有一个“计数器”字段
class OtherObject(models.Model):
...
counter = models.PositiveIntegerField(default=0)
...
这将是很好,我可以查询我所有为MyModel对象由相关对象的计数器数值进行排序。
谢谢!
在查询集中没有这样做的优雅方式。要在SQL中进行排序,您必须将MyModel
表加入到content_type
所引用的每个其他表中。
您可以在python中排序,但请注意这需要每个对象一次查找。
queryset = list(MyModel.objects.all())
sorted_queryset = sorted(queryset, key=lambda x: x.content_object.counter)
如果排序在柜台实地有效对你很重要,你可能要考虑移动计数器字段(或复制吧)MyModel
。
在您的模型中,您可以定义一个内部Meta类并定义您的排序。
class MyModel(models.Model):
...
class Meta:
ordering = ['counter']
必须测试它,但我认为这是朝正确方向迈出的一步。
好的,但在每个相关对象内部计数器,但不在MyModel类 – ScotchAndSoda 2012-03-04 19:07:31
不确定,但会content_object__counter工作? – esse 2012-03-05 18:16:27
不幸的是,不是因为content_object不是一个sql字段,Django也不能识别它 – ScotchAndSoda 2012-03-06 20:26:01
我目前通过类似的方法查找每个对象。我想移动MyModel中的计数器字段,但“MyModel”是第三方Django应用程序的一部分。我认为我会完成分叉应用程序并添加我的领域。对于我处理排序方法的大量对象需要大约一分钟的时间。否则,看起来联合可能是一个解决方案。 – ScotchAndSoda 2012-03-06 20:34:10