我正在寻找一种优雅的方式来按特定内容对象的字段订购查询集。
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对象。
谢谢!
答案 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']
必须测试它,但我认为这是朝着正确方向迈出的一步。