Django 通用外键排序

min*_*gle 3 python sql sorting generics django

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

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')
Run Code Online (Sandbox Code Playgroud)

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

Status.objects.all().order_by('request__name', 'another_request__name', 'third_request__name')
Run Code Online (Sandbox Code Playgroud)

然而,使用这种方法,所有“请求”都被排序在一个块中,然后是“another_request”,然后是“third_request”

反正有没有把所有这些排序在一起?我可以通过将其转换为列表来实现。但在这种情况下,我需要使用 Queryset。

在此先感谢您的帮助。

Ris*_*nha 5

如果您希望它们以相同的方式处理(从您希望它们按其共同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')
Run Code Online (Sandbox Code Playgroud)

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

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

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