【发布时间】:2019-09-06 01:58:52
【问题描述】:
玩具示例:在我的 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()
...
# blog/models.py
class BlogPost(models.model):
title = models.CharField(max_length=100)
post = models.TextField()
owner = models.ForeignKey('core.User', on_delete=models.CASCADE)
...
我正在使用 DRF 和我的一个 ViewSets,我在其中返回当前登录用户的所有 BlogPosts 的列表。为此,我需要创建一个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()
这对我来说似乎很错误,并且让我有点不舒服,因为它违反了单一责任原则。即用户模型应该对其他模型一无所知。
我来自 express、springboot 等其他框架,我会创建一个 BlogService 并将 viewable_blogs 的功能放在那里:
class BlogPostViewSet(viewsets.ModelViewSet):
serializer_class = BlogPostSerializer
def get_queryset(self):
return BlogService.getBlogsForUser(self.request.user)
有没有 Django 推荐的方法来确保封装?制作服务类是 Django 的一种方式吗?
【问题讨论】:
标签: python django django-rest-framework