2012-11-24 79 views
0


我做了一個通用的外鍵,以通用的方式引用報表模型中的任何類型(A或B)模型。
它工作正常,但我的問題是,現在,我需要做一個查詢來檢索所有引用特定類型的模型的報表實例(例如所有具有foreign_key引用類A的報表)。我試圖訪問CONTENT_TYPE在數據庫中,但顯然這是不可能的(該變量不存在...)
這裏是我的模型:
Django - 如何引用泛型外鍵中的特定類型?

class Report(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.CharField(max_length=50) 
    reported_item = generic.GenericForeignKey('content_type', 'object_id') 

class A(models.Model): 
    reports = generic.GenericRelation(Report) 

class B(models.Model): 
    reports = generic.GenericRelation(Report) 

你有任何想法如何做到這一點?
爲了防萬一它會改變任何東西,我使用mongoDB作爲我的數據庫。
非常感謝!

編輯:
當我在數據庫中顯示的報表對象,這裏是結果:

db.website_report.findOne() 
{ 
"_id" : ObjectId("50afa903a96c5c2f63000001"), 
"content_type_id" : ObjectId("50afa903a96c5c2f63000000"), 
"object_id" : "50afa8a8a96c5c2f53000001", 
} 

正如你所看到的,數據庫的內容無關,同我的模型,所以我不要相似不知道如何進行查詢以獲取所有具有A的外鍵的報告。
您能幫助我嗎?

+0

當您試圖按內容類型查找時,「變量不存在」是什麼意思。當然,這是做這件事的方法,所以你應該發佈你試過的代碼,這樣我們就可以看到出了什麼問題。 –

回答

3

我不明白你爲什麼認爲db不能反映你的模型。你有內容類型參考和對象ID。所有您需要VDO是找出哪些內容類型是指模型中的一個,這是在contenttype documentation解釋說:

ct = ContentType.objects.get_for_model(A) 
objs = Report.objects.filter(content_type=ct) 
+0

謝謝! 我其實只是找到了相同的解決方案... – koleror

-1

Filtering on GenericForeignKeys is not possible:

由於道路GenericForeignKey實現,你不能直接與過濾器通過數據庫API使用這些字段(過濾器(),不包括()等)。因爲GenericForeignKey不是普通的字段對象,所以這些例子不起作用:

+0

是的,我看到了,但這不是一個工作嗎? – koleror

+0

這個答案與問題無關。 –

0

這是我的一個項目爲例類,它顯示了一定的模型和限制使用Q對象的應用程序

class ContainerItem(models.Model) : 
    """Items for containers""" 
    limit = models.Q(model="page") & (models.Q(app_label='events') | models.Q(app_label='press')) & ~models.Q(app_label='press', model='category') 
    object_type = models.ForeignKey(ContentType, limit_choices_to=limit) 
    object_id = models.IntegerField(db_index=True) 
    object = generic.GenericForeignKey(
     ct_field = "object_type", 
     fk_field = "object_id" 
    ) 
相關問題