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。
在此先感谢您的帮助。
如果您希望它们以相同的方式处理(从您希望它们按其共同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 索引)。