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

时间:2012-03-04 18:59:34

标签: django django-models

我正在寻找一种优雅的方式来按特定内容对象的字段订购查询集。

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对象。

谢谢!

3 个答案:

答案 0 :(得分:4)

在查询集中没有一种优雅的方法可以做到这一点。要在SQL中进行排序,您必须将MyModel表连接到content_type引用的每个其他表。

您可以在python中进行排序,但请注意,每个对象需要一次查找。

queryset = list(MyModel.objects.all())
sorted_queryset = sorted(queryset, key=lambda x: x.content_object.counter)

如果有效地对计数器字段进行排序对您来说非常重要,您可能需要考虑将计数器字段(或将其复制)移动到MyModel

答案 1 :(得分:1)

选择对象后,您可以使用order_by属性。

Mymodels.objects.all().order_by('name_field')

引用:https://books.agiliq.com/projects/django-orm-cookbook/en/latest/asc_or_desc.html

答案 2 :(得分:0)

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

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

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