列出对象的多对多引用以及缺少对集合的引用的最佳方法是什么?

时间:2013-08-27 22:47:23

标签: python django django-models

我正在开发一个简单的网站。有些主人从某个列表中提供服务,管理员创建和维护这些服务。任何给定的主人都可以提供服务的子集,他可以只提供一次给定的服务或者根本不提供服务,并且以特定的价格提供服务。这是我到目前为止所做的,很明显:

class Service(models.Model):
    name = models.CharField(max_length=200)

class Master(models.Model):
    name = models.CharField(max_length=200)
    services = models.ManyToManyField(Service, through='MasterService')

class MasterService(models.Model):
    master = models.ForeignKey(Master)
    service = models.ForeignKey(Service)

    price = models.PositiveIntegerField(blank=True, null=True) # masters can avoid listing the exact price if they want

    class Meta:
        unique_together=("master", "service")

但是当我在视图中呈现主人时,我想列出所有可用的服务 - 包括那些给予主人没有提供的服务,并提供适当的评论。实现此功能的最佳方法是什么?

我有这些可能的解决方案:

  • 在查看器中创建一个特殊的帮助器类,它由MasterService和一个特殊的布尔值组成,它指示该服务是否可用。每次调用某个主服务器的视图时,为每个可能的服务组成此类的对象列表。看似简单但不优雅。

  • 在MasterService类本身中创建这个特殊的布尔字段。这样我就必须在数据库MasterService对象中为任何Master * Service组合创建并保存,这看似过多。

  • 将所有可用服务传递到主视图模板中,并在模板中迭代它们,检查它们是否存在于master.masterservice_set中。似乎是最好的方法,但我不明白如何使用django的模板系统来做到这一点。

P.S。:我不仅寻求可能的解决方案如何实现这一功能,还希望学习与django和python意识形态相关的最佳方式,这对我来说仍然很陌生。

1 个答案:

答案 0 :(得分:0)

https://docs.djangoproject.com/en/dev/misc/design-philosophies/

import this

从解释器中获取python哲学。

这就是哲学。

如果可以在一个函数中完成,则创建一个类可能很重。不是很优雅,你说的。 创建一个存储的布尔...过多,你说的。

然后是第三个命题。足够近! “主视图模板” 如果你想用一些检查进行迭代,它就在'视图'中,逻辑允许它。不在模板中,即模板,不是数据处理,它接收处理过的数据只是为了显示它。