2013-03-21 39 views
0

一個小問題最有用的Django框架的約一:Django和網站的關係框架鏈接

django.contrib.sites

假設我有一個模型:

class MyModel(models.Model): 
    info = models.TextField() 
    site = models.ManyToManyField(Site) 
    objects = models.Manager() 
    on_site = CurrentSiteManager() 

和另一種模式,那就是掛如上所示:

class MyModelSupplement(models.Model): 
    info = models.TextField() 
    parent_model = models.ForeignKey(MyModel) 

Scheme指定,MyModelSupplement不能屬於站點,它是par恩不屬於。具有這種結構

我可以訪問爲MyModel對象的給定站點上簡單地通過調用

MyModel.on_site.all()
代碼。在 MyModelSupplement模型上實現相同的最佳方法是什麼?

我能想到的一些方法來解決這個問題:

  1. 把相同網站領域MyModelSupplement和定義相同CurrentSiteManager(將不是有點多餘?)
  2. 使用MyModelSupplement.objects.filter(parent_model__site__id = some_site_id)
  3. MyModel.on_site.all().values_list('mymodelsupplement')
  4. 甚至去這個變種:
my_models = MyModel.on_site.all()  
my_models_supplements = MyModelSupplements.objects.filter(parent_model__in=my_models).select_related()

有沒有更好的方法來完成上述任務?需要說明的是,我需要同時訪問這兩個模型並分別嘗試檢索尊重給定站點的實例嗎?

也許有這樣一種說法:從MyModel的所有SiteID值應在MyModelSupplement。如果從MyModel實例中刪除了SiteID值,則應將其從所有MyModelSupplements中刪除,這些值與具有ManyToMany關係的受尊重的MyModel實例相關。

這是可以實現的嗎?

+0

'mymodelsupplement.parent_model.site.all()'? – 2013-03-21 13:20:04

+0

當我需要MyModelSupplements實例時,這將會檢索parent_model(本例中爲MyModel)實例。甚至不知道你的行是否可以工作,從MyModelSupplement類調用(不是實例)。 – 2013-03-21 13:24:31

回答

0

我能解決這個問題的方式如下:

這正好一切發生之前:

from django.conf import settings 

在那之後,我們創建一個自定義的經理:

class OnSiteMyModelSupplementManager(models.Manager): 
    def get_query_set(self): 
     return super(OnSiteMyModelSupplementManager, self).get_query_set().filter(parent_model__sites=settings.SITE_ID) 

和簡單將兩行代碼放入MyModelSupplement類:

objects = models.Manager() 
on_site = OnSiteMyModelSupplementManager() 

現在我可以檢索只屬於當前網站的MyModelSupplements,就像父母那樣。