2016-02-17 24 views
1

所以我有了與其他三款車型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') 

所以目前我正與一個表中的名稱顯示狀態的通用外鍵關係的典範。我希望能夠按名稱排序。目前我正在這樣排序。

Status.objects.all().order_by('request__name', 'another_request__name', 'third_request__name') 
但是用這種方法

所有的「要求」的一大塊進行排序,然後「another_request」,然後「third_request」

反正是有排序的所有這些在一起嗎?我能夠通過將其轉換爲列表來實現它,但在這種情況下,我需要使用Queryset。

在此先感謝您的幫助。

回答

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方法),或者通過創建一個通用接口 - 這就是這種Model繼承方法。

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

當然還有其他一些方法,包括那些在Django模型之外的方法:例如生成一個額外的查找結構,如搜索索引,它將根據需要包含轉換後的數據(例如干草堆索引)。

+0

這很有道理。非常感謝你,我會嘗試一下。 – mingle

+0

所以不幸的是,當我嘗試實現這個方法時,我得到了 '無法獲取'012r'當我執行'Status.objects.all()' – mingle

+0

你是否重寫了'__str__'和/或'__repr__'在'狀態'上?檢查實施。我需要更多信息(堆棧跟蹤,相關代碼)才能幫助您。 – Risadinha