所以我有一个与其他三个模型具有通用外键关系的模型
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。
提前感谢您的帮助。
答案 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模型之外的方法:例如,生成一个额外的查找结构,如搜索索引,它将根据需要包含您的转换数据(例如,大海捞针索引)。