Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关注点分离的模型方法_Python_Django_Django Rest Framework - Fatal编程技术网

Python 关注点分离的模型方法

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 =

玩具示例:在我的Django项目中,我有两个应用程序:
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()