簡體   English   中英

過濾普通模型與Django多態模型的子類的關系?

[英]Filtering plain models on their relation to a subclass of a django polymorphic model?

我有一個普通的Django模型,該模型具有與django-polymorphic模型的ForeignKey關系。

讓我們調用第一個PlainModel ,它具有一個content類型為帶有VideoAudio子類型的多態Content模型的ForeignKey字段(簡化示例)。

現在,我要查詢所有引用Video PlainModel實例。

問題是我找到的所有文檔都是關於直接通過多態模型本身進行過濾的。 因此,在此示例中,諸如Content.objects.instance_of(Video)類的東西。 但是我需要PlainModel ,所以它需要看起來像PlainModel.objects.filter(content__instance_of=Video) 我嘗試了很多變化,但找不到任何有效的方法。

在文檔中,他們使用Q(instance_of=ModelB) ,但這不適用於Q(content__instance_of=ModelB)的關系。 會出現類似“無法查詢“ x”:必須是“ y”實例”的錯誤。 即使使用翻譯調用,我想也是因為PlainModel不了解多態。

我有一個臨時技巧,可以使用常規Django過濾器(例如PlainModel.objects.filter(content__polymorphic_ctype_id=my_content_type_id)直接過濾polymorphic_ctype字段,但這不能處理子類。 例如:尋找Video時找不到ExtendedVideo ,因為它具有不同的ContentType ID。

我可以解決這個問題,並保留一個允許的子類型列表,或者解析類型層次結構以獲取過濾器的更多內容類型,但這似乎與django-polymorphic的功能重復。

為此,您可以首先獲取所有具有Video子類型的PlainModel實例,然后查詢該查詢集中的外鍵關系:

content_videos = Content.objects.instance_of(Video)
plain_model_videos = PlainModel.objects.filter(content__in=content_videos)

請參閱文檔以供參考。

視頻plain_models:

PlainModel.objects.filter(content__video__isnull=False)

除視頻之外的其他plain_models:

PlainModel.objects.filter(content__video__isnull=True)

暫無
暫無

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

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