簡體   English   中英

Django通用外鍵排序

[英]Django Generic Foreign Key Sorting

所以我有一個與其他三個模型具有通用外鍵關系的模型

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')

但是使用這種方法,所有'request'都在一個chunk中排序,然后'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')

更一般的解釋是:為了能夠按一個屬性對對象進行排序,您必須明確它們共享同一個屬性。 通過在您自己的例程中獲取值並創建可排序的列表(這將是您提到的qs方法)或創建公共接口 - 這是此模型繼承方法。

但是,只要您不使用表繼承,就無法使用數據庫進行排序(意思是:您不能使用Django ORM進行排序)。

當然還有其他方法,包括Django模型之外的方法:例如,生成一個額外的查找結構,如搜索索引,它將根據需要包含您的轉換數據(例如,大海撈針索引)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM