社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

好的Django设计实践,在DRY之后添加REST api

karlosss • 5 年前 • 1456 次点击  

“老式的”和REST部分都共享模型,但是视图略有不同(例如权限定义),表单被序列化器替换。最明显的做法是重复应用程序逻辑几次,因此无法遵循DRY原则,因此代码无法维护。

我有一个想法,把所有的逻辑写入模型(因为它们是共享的),但是在这种情况下,将不使用权限混合,泛型视图,代码不会是最好的。

现在我没有主意了。这里的最佳做法是什么?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53951
文章 [ 1 ]  |  最新文章 5 年前
fabio.sussetto
Reply   •   1 楼
fabio.sussetto    6 年前

我会尽量保持事情的简单性,因为你对API的未来需求不确定,猜测可以引入额外的复杂性,甚至在需求明确时甚至不需要。

Django表单和Rest框架序列化程序都已经为您提供了一种声明性方法,该方法抽象出基本内容所需的样板代码,而基本内容通常占据了大部分代码。

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']

在未来,DRS序列化程序将是:

class ArticleSerializer(ModelSerializer):
    class Meta:
        model = Article
        fields = ['title', 'content']

如您所见,如果您尝试坚持使用ModelForm和ModelSerializer,那么无论如何都不会有太多重复。您还可以简单地将字段列表存储在变量中并重用它。

对于更多自定义内容,可以从将逻辑共享到简单函数开始,例如:

def save_article_with_author(article_data, author_data):
    # custom data manipulation before saving, consider that article_data will be a dictionary either if it comes from deserialized JSON (api) or POST data
    # send email, whatever

对于与数据获取相关的所有内容,我将尽量使用模型管理器,定义可以恢复的自定义查询集,例如表单和序列化程序的选项。

然后,稍后将要求您编写一个简单的管理命令,用于从电子表格批量导入用户。在这一点上,您在save()方法中所做的工作确实会妨碍您的工作,因为您可以通过模型自由地访问数据,而不必费心使用权限、电子邮件等。

https://www.django-rest-framework.org/topics/html-and-forms/

块引用 REST框架适合于返回API风格的响应和常规HTML页面。此外,序列化程序可以用作HTML表单并在模板中呈现。

以下是一些关于如何根据请求内容类型从HTML动态切换到JSON的指导原则:

https://www.django-rest-framework.org/api-guide/renderers/#advanced-renderer-usage