gpt4 book ai didi

python - 模型方法关注点分离

转载 作者:行者123 更新时间:2023-12-01 01:02:10 25 4
gpt4 key购买 nike

玩具示例:在我的 Django 项目中,我有两个应用程序:CoreBlog

核心应用程序为用户提供功能;用户模型、登录注销、注册等
博客应用程序提供博客功能;博客、评论、类别等

感兴趣的主题是模型:

# 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 之一,其中我返回当前登录用户的所有 BlogPost 的列表。为此,我需要创建一个 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 的一种方式吗?

最佳答案

对于相关模型(即 UserBlogPost),我认为 Django 会自动为您的 User 创建一个 RelatedManager code> 实例,具有名为 blogpost_set 的属性。

因此,您应该能够通过以下方式获取特定用户的博客文章:

user = User(pk=1)
user.blogpost_set.all()

这与您在 viewable_blogs 方法中手动完成的功能基本相同,但 Django 倾向于使用内置的“管理器”来执行关系查询集。我想说创建 BlogService 可能不是理想的选择,因为它为模型之间的关系添加了一个额外的层,而 Python 倾向于使用更简单的方法。

参见:

关于python - 模型方法关注点分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55700142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com