0

关于最有用的 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 不能属于站点,它的父级不属于。

有了这个结构,我可以简单地通过调用来访问给定站点上的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()

有没有更好的方法来完成上述任务?请注意,我需要同时和单独访问这两个模型,试图检索给定站点尊重的实例?

也许有一种方法可以说:所有来自的 SiteID 值MyModel都应该在MyModelSupplement. 如果 SiteID 值已从MyModel实例中删除,则应从所有与具有多对多关系MyModelSupplements的受尊重实例相关的所有实例中删除。MyModel

这是可以实现的吗?

4

1 回答 1

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,就像父母一样。

于 2013-03-23T05:11:53.550 回答