按Django中的内容对象的值排序

按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

+0

我目前通过类似的方法查找每个对象。我想移动MyModel中的计数器字段,但“MyModel”是第三方Django应用程序的一部分。我认为我会完成分叉应用程序并添加我的领域。对于我处理排序方法的大量对象需要大约一分钟的时间。否则,看起来联合可能是一个解决方案。 – ScotchAndSoda 2012-03-06 20:34:10

在您的模型中,您可以定义一个内部Meta类并定义您的排序。

class MyModel(models.Model): 
    ... 
    class Meta: 
     ordering = ['counter'] 

必须测试它,但我认为这是朝正确方向迈出的一步。

+0

好的,但在每个相关对象内部计数器,但不在MyModel类 – ScotchAndSoda 2012-03-04 19:07:31

+0

不确定,但会content_object__counter工作? – esse 2012-03-05 18:16:27

+0

不幸的是,不是因为content_object不是一个sql字段,Django也不能识别它 – ScotchAndSoda 2012-03-06 20:26:01