(警告:我对Django和MVC模型很新)
假设我在模型中有以下类:
class Member(models.Model):
user = models.OneToOneField(User)
class Project(models.Model):
name = models.CharField(max_length=200)
class ProjectMember(models.Model):
unique_together = ('project', 'member')
project = models.ForeignKey(Project)
member = models.ForeignKey(Member)
现在,我想获得一个成员的所有项目列表。所以我补充道:
@property
def projects(self):
return Project.objects.filter(projectmember__member=self)
但我也可以在视图中添加此过滤器或构建额外的功能来执行此操作。有什么指导吗?模型应该包含任何属性吗?它使代码可重用,但我可以通过额外的功能实现相同的功能,这不会使模型混乱。
答案 0 :(得分:1)
模型确实可以具有属性和其他方法。这实际上很常见,因为模型上的许多操作都可以进入方法。如果属性或方法合适,则无需将其移动到单独的函数中。
当一个单独的函数处理多个模型或者特别是与一个模型没有真正关联的东西时,它会很有用。
答案 1 :(得分:1)
在Django中遵循“胖模型,瘦视图”结构通常被认为是一种好习惯。这意味着您对视图的逻辑越少越好。显然一些视图逻辑是不可避免的,但总的来说,很多像你想要做的任务更适合在模型上。
答案 2 :(得分:1)
Project.objects.filter(projectmember__member=self)
这是一个非常简单的查询,并确保视图是更好的地方,没有任何方法或属性。此外,您不必记住模型projects
中的均值属性Project
。
如果有更多逻辑要添加,缓存或其他东西,以及是否可以从应用程序的许多部分(不是一个特定视图)调用该方法,我会在单独的方法中移动该代码。
答案 3 :(得分:1)
最好使用反向关系:
member.project_set.all()
由django自动创建,更多信息:https://docs.djangoproject.com/en/dev/topics/db/queries/#m2m-reverse-relationships