2013-08-28 44 views
2

考慮以下兩個Django模型:在Django中可以使用PositiveIntegerField作爲外鍵嗎?

class Item(models.Model): 
    ''' 
    Represents a single item. 
    ''' 
    title = models.TextField() 

class Information(models.Model): 
    ''' 
    Stores information about an item. 
    ''' 
    approved   = models.BooleanField(default=False) 
    multipurpose_field = models.PositiveIntegerField() 

由於模型的組織方式,我不得不在Information使用PositiveIntegerField爲引用的Item而不是使用ForeignKey。這使查詢變得更加困難。

我想選擇Information實例引用的所有項目,approved設置爲True。換句話說,我想這樣做:

Information.objects.filter(approved=True) 

......除了查詢將返回Information代替multipurpose_field引用的Item實例。

我可能與原始SQL做到這一點:

SELECT app_item.title FROM app_item 
    LEFT JOIN app_information 
    ON app_information.multipurpose_field = app_item.id 
    WHERE app_information.approved = 1 

有沒有辦法做到這一點,而不訴諸原始SQL(這往往不是非常便攜)?

+0

你能解釋一下你是「被迫在'使用'PositiveIntegerField'的原因信息'引用一個'Item'而不是使用'ForeignKey'「?這就是使這很難。 –

+0

@PeterDeGlopper:因爲它根據上下文從多個不同模型中引用行。 –

+0

啊 - 我不認爲ORM公開了任何方式直接進行連接。我個人會使用contenttypes框架中可用的通用關係來表示,但這些關係在濾鏡中也不起作用。你可能可以用'extra'來做到這一點,因爲它是尷尬的。 –

回答

0

ForeignKey的字段類型由相關字段確定。考慮重新設計你的模型是這樣的:

class Item(models.Model): 
    id = models.PositiveIntegerField(primary_key=True) 
    title = models.TextField() 

class Information(models.Model): 
    approved   = models.BooleanField(default=False) 
    multipurpose_field = models.ForeignKey(Item) 

那麼你的查詢將被用這種方式代表:

Item.objects.filter(information__approved=True) 
相關問題