Django通用外键排序

时间:2016-02-17 17:16:39

标签: python sql django sorting generics

所以我有一个与其他三个模型具有通用外键关系的模型

class Status(BaseRequestStatus):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class Request(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    ...some fields
    statuses = GenericRelation(Status, related_query_name='request')

class AnotherRequest(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    ...some fields
    statuses = GenericRelation(Status, related_query_name='another_request')

class ThirdRequest(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    ...some fields
    statuses = GenericRelation(Status, related_query_name='third_request')

所以目前我在表格中显示名称的状态。我希望能够按名称排序。目前我正在这样排序。

Status.objects.all().order_by('request__name', 'another_request__name', 'third_request__name')

然而,使用这种方法,所有的请求都是'在一个块中排序,然后是另一个请求'然后' third_request'

无论如何都要把所有这些放在一起?我能够通过将其转换为列表来实现它。但在这种情况下,我需要使用Queryset。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

如果您希望它们以相同的方式处理(从您希望它们按公共name字段排序的事实推断出这一点),则表明这些模型具有相同的基础。

在这种情况下,使用模型继承,使用抽象的基本模型,并定义name字段和通用fkey关系。

class RequestBase(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    statuses = GenericRelation(Status, related_query_name='request')

    class Meta:
        abstract = True

class Request(RequestBase):
    # ... more fields

Status.objects.all().order_by('request__name')

更一般的解释:为了能够按一个属性对对象进行排序,您必须明确它们共享同一个属性。通过在您自己的例程中获取值并创建可排序的列表(这将是您提到的qs方法)或创建公共接口 - 这是此模型继承方法。

但是,只要您不使用表继承,就无法使用数据库进行排序(意思是:您不能使用Django ORM进行排序)。

当然还有其他方法,包括那些在Django模型之外的方法:例如,生成一个额外的查找结构,如搜索索引,它将根据需要包含您的转换数据(例如,大海捞针索引)。