Python 关注点分离的模型方法
玩具示例:在我的Django项目中,我有两个应用程序:Python 关注点分离的模型方法,python,django,django-rest-framework,Python,Django,Django Rest Framework,玩具示例:在我的Django项目中,我有两个应用程序:Core和Blog 核心应用提供用户功能;用户模型、登录注销、注册等 博客应用程序提供博客功能;博客、评论、分类等 感兴趣的主题是模型: # core/models.py class User(models.Model): firstName = models.CharField(max_length=100) lastName = models.CharField(max_length=100) email =
Core
和Blog
核心应用提供用户功能;用户模型、登录注销、注册等
博客应用程序提供博客功能;博客、评论、分类等 感兴趣的主题是模型:
# core/models.py
class User(models.Model):
firstName = models.CharField(max_length=100)
lastName = models.CharField(max_length=100)
email = models.EmailField()
...
我使用的是DRF,其中一个视图集返回了当前登录用户的所有博客帖子列表。为此,我需要创建一个
QuerySet
我可以在用户对象上创建一个模型方法,如下所示:
# core/models.py
class User(models.Model):
...
def viewable_blogs(self):
return BlogPost.objects.filter(owner=self.id)
只需这样使用它:
class BlogPostViewSet(viewsets.ModelViewSet):
serializer_class = BlogPostSerializer
def get_queryset(self):
return self.request.user.viewable_blogs.all()
这在我看来是非常错误的,让我有点不舒服,因为它违反了单一责任原则。i、 e用户模型应该对其他模型一无所知 我来自express、springboot等其他框架,我会创建一个
BlogService
,并将可查看的_blogs
功能放在那里:
class BlogPostViewSet(viewsets.ModelViewSet):
serializer_class = BlogPostSerializer
def get_queryset(self):
return BlogService.getBlogsForUser(self.request.user)
是否有Django推荐的方法来确保封装?使服务类成为Django实现这一点的一种方法吗?对于相关模型(即,User
和BlogPost
),我认为Django会自动为您的用户
实例创建一个名为BlogPost\u集
的相关管理器
因此,您应该能够通过以下方式获取特定用户的博客帖子:
user = User(pk=1)
user.blogpost_set.all()
这基本上与您在viewable_blogs
方法中手动完成的功能相同,但Django倾向于使用内置的“管理器”进行关系查询集。我想说,创建一个BlogService
可能并不理想,因为它为模型之间的关系添加了一个附加层,Python倾向于使用更简单的方法
见:
这在本例中是可行的,但如果我需要一个更复杂的查询,如“返回此用户的所有帖子和用户的管理员帖子”,那么这对更复杂的查询不起作用,您可以创建一个自定义管理器,根据您的条件获取查询集。看:很高兴这对你有用!我发现其他语言中的许多概念和设计模式都可以用不同的术语用Django表达,但在某些方面,一旦你习惯了Django的做事方式,它们实际上就更简单了。Django非常擅长确保其大多数功能都是高度可定制的。
user = User(pk=1)
user.blogpost_set.all()