Django个人博客搭建教程---使用serializers序列化django对象

本文主要是介绍Django个人博客搭建教程---使用serializers序列化django对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们有一个数据表模型如下,需要将这个数据对象序列化为json格式

class Articles(models.Model):id = models.AutoField(primary_key=True)         # idtitle = models.CharField(max_length=150)        # 博客标题# body = models.TextField()  # 博客正文body = MDTextField()timestamp = models.DateTimeField()  # 创建时间authorname = models.ForeignKey('blog.BlogUser', on_delete=models.CASCADE)  # 作者姓名views = models.PositiveIntegerField(default=0)category = models.ForeignKey(Category, on_delete=models.CASCADE, primary_key=False)tags = models.ManyToManyField(Tag, blank=True, null=True)greats = models.PositiveIntegerField(default=0)comments = models.IntegerField(default=0)status = models.CharField(max_length=20, default="DEL")brief = models.CharField(max_length=200, blank=True, null=True)pic = models.ImageField(upload_to='jiablogimages')# bodypic = models.ImageField(upload_to='jiablogimages', blank=True, null=True)istop = models.CharField(max_length=5, default='', null=True, blank=True)articlebodybrief = models.TextField(blank=True, null=True)last_edit_timestamp = models.DateTimeField(auto_now=True, verbose_name="更新时间", editable=True)url_slug = models.SlugField(editable=False, max_length=200)

 

from django.core import serializers@require_http_methods(["GET"])
def show_books(request):response = {}try:articles = Articles.objects.filter(status="有效").order_by("id")response['list'] = json.loads(serializers.serialize("json", articles, ensure_ascii=False))response['msg'] = 'success'response['error_num'] = 0except Exception as e:response['msg'] = str(e)response['error_num'] = 1return HttpResponse(json.dumps(response, ensure_ascii=False))

这里没啥问题,重点是模型中使用了外键和多对多的时候,序列化无法展示完整名称

会出现这样的情况,外键和多对多关联的数据都只展示了id

{"model": "blog.articles","pk": 111,"fields": {"title": "Django个人博客搭建教程---使用Pygments和markdown实现代码高亮","body": "views.py\r\n```python\r\nimport markdown\r\nfrom markdown.extensions.toc import TocExtension\r\n \r\n \r\ndef blog_detail(request, article_id, slug):\r\n    try:\r\n        thisarticle = get_object_or_404(Articles, id=article_id, status='有效')\r\n        if thisarticle.url_slug != slug:\r\n            return render(request, '404.html')\r\n        thisarticle.increase_views()\r\n    except Exception as e:\r\n        return render(request, '404.html')\r\n    md = markdown.Markdown(extensions=[\r\n        'markdown.extensions.extra',\r\n        'markdown.extensions.codehilite',\r\n        # 'markdown.extensions.toc',\r\n        TocExtension(slugify=slugify)\r\n    ])\r\n    thisarticle.body = md.convert(thisarticle.body)\r\n    context = {\r\n        'blog': thisarticle,\r\n        'toc': md.toc,\r\n \r\n    }\r\n    return render(request, 'single.html', context=context)  # 返回info.html页面\r\n```\r\n使用Pygments生成css\r\n```\r\npygmentize -f html -a .codehilite -S tango >  tango.css \r\n```\r\n-a .codehilite指所有css选择器都具有.codehilite这一祖先选择器\r\n-S default就是指定所需要的样式了,各位可以对各种样式都尝试一下。\r\n> tango.css将内容输出到tango.css文件中\r\n\r\n关于样式,可以在python环境中查看\r\n```shell\r\nArithmetic@qingjiaowosuanshujiadeMacBook-Pro MyBlog % python3\r\nPython 3.6.6 (v3.6.6:4cf1f54eb7, Jun 26 2018, 19:50:54) \r\n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin\r\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\r\n>>> from pygments.styles import STYLE_MAP\r\n>>> STYLE_MAP.keys()\r\ndict_keys(['default', 'emacs', 'friendly', 'colorful', 'autumn', 'murphy', 'manni', 'monokai', 'perldoc', 'pastie', 'borland', 'trac', '\r\nnative', 'fruity', 'bw', 'vim', 'vs', 'tango', 'rrt', 'xcode', 'igor', 'paraiso-light', 'paraiso-dark', 'lovelace', 'algol', 'algol_nu', 'arduino',\r\n'rainbow_dash', 'abap', 'solarized-dark', 'solarized-light', 'sas', 'stata', 'stata-light', 'stata-dark', 'inkpot'])\r\n>>> \r\n```\r\n在html文件中使用css\r\n```html\r\n<link type=\"text/css\" rel=\"stylesheet\" href=\"/static/css/tango.css\">\r\n```\r\n我选择的就是tango,效果如下\r\n![](https://img-blog.csdnimg.cn/20200207175512237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NzamRvdWRvdQ==,size_16,color_FFFFFF,t_70)","timestamp": "2020-02-16T17:09:59","authorname": 1,"views": 9,"category": 1,"greats": 0,"comments": 0,"status": "有效","brief": null,"pic": "jiablogimages/photo-1581794860915-341d339f0dde_gaitubao_800x450.jpg","istop": null,"articlebodybrief": "views.py\r\npython\r\nimport markdown\r\nfrom markdown.extensions.toc import TocExtension\r\n \r\n \r\ndef blog_detail(request, article_id, slug):\r\n    try:\r\n        thisarticle = get_object_or_404(Articles, id=a","last_edit_timestamp": "2020-02-16T17:58:55.064","url_slug": "djangoge-ren-bo-ke-da-jian-jiao-cheng-shi-yong-pygmentshe-markdownshi-xian-dai-ma-gao-liang","tags": [1,3]}
}

只要在序列化的时候加上

use_natural_foreign_keys=True

像这样

from django.core import serializers@require_http_methods(["GET"])
def show_books(request):response = {}try:articles = Articles.objects.filter(status="有效").order_by("id")response['list'] = json.loads(serializers.serialize("json", articles, use_natural_foreign_keys=True, ensure_ascii=False))response['msg'] = 'success'response['error_num'] = 0except Exception as e:response['msg'] = str(e)response['error_num'] = 1return HttpResponse(json.dumps(response, ensure_ascii=False))

 然后在对应的外键和多对多关联的数据表模型中加上

def natural_key(self):return self.__str__()

完整示例如下 

class Category(models.Model):"""Django 要求模型必须继承 models.Model 类。Category 只需要一个简单的分类名 name 就可以了。CharField 指定了分类名 name 的数据类型,CharField 是字符型,CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。Django 内置的全部类型可查看文档:https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types"""id = models.AutoField(primary_key=True)name = models.CharField(max_length=100)def natural_key(self):return self.__str__()def catcount(self):return Articles.objects.filter(category__name__exact=self.name).filter(status='有效').count()def __str__(self):return self.nameclass Tag(models.Model):"""标签 Tag 也比较简单,和 Category 一样。再次强调一定要继承 models.Model 类!"""id = models.AutoField(primary_key=True)name = models.CharField(max_length=100)def natural_key(self):return self.__str__()def __str__(self):return self.name

 

这篇关于Django个人博客搭建教程---使用serializers序列化django对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657327

相关文章

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t