django和网站框架在关系中链接

时间:2013-03-21 13:14:54

标签: django django-models

关于最有用的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.on_site.all()
代码即可访问给定网站上的 MyModel 对象。在 MyModelSupplement 模型上实现相同目标的最佳方法是什么?

我可以想办法解决这个问题:

  1. 在MyModelSupplement中放置相同的 site 字段并定义相同的CurrentSiteManager(这不会有点多余吗?)
  2. 使用MyModelSupplement.objects.filter(parent_model__site__id = some_site_id)
  3. MyModel.on_site.all().values_list('mymodelsupplement')
  4. 甚至可以选择这个变种:
  5. 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实例相关。

    这可以实现吗?

1 个答案:

答案 0 :(得分: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,它们只属于当前的网站,就像父母一样。