我刚刚开始在教程中逐步学习Django REST框架。
在本教程中,我声明了与 Django 的形式非常相似的序列化程序,以便提供一种将代码片段实例序列化和反序列化为表示形式(如 json(的方法。
这是片段/模型.py。
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
class Meta:
ordering = ('created',)
这是代码片段/序列化程序.py。
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
class SnippetSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template': 'textarea.html'})
linenos = serializers.BooleanField(required=False)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
def create(self, validated_data):
return Snippet.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.code = validated_data.get('code', instance.code)
instance.linenos = validated_data.get('linenos', instance.linenos)
instance.language = validated_data.get('language', instance.language)
instance.style = validated_data.get('style', instance.style)
instance.save()
return instance
在 Django 文档中,我找不到allow_blank,style = {'base_template' : 'textarea.html'} 作为 CharField 属性,所以我不知道它们是什么意思。
我想知道标题=模型之间的区别。models.py 中的 CharField(max_length=100,空白=True,默认值=''(,标题 = 序列化程序。CharField(required=False, allow_blank=True, max_length=100( in serializers.py.
请告诉我。谢谢你的时间。
好的,首先对于 CharFields,不要将空白和默认值都设置为 True 和空字符串。空白就足够了。空白表示该字段不是必需的,可以为空。其次,在序列化程序中定义与模型中完全相同的字段。你可以从字面上删除所有这些。DRF 为您做到这一点,这就是重点。它只是模拟模型中描述的字段的属性。
您也可以删除创建和更新方法,它们会自动发生。
这就是你真正需要的。
from rest_framework import serializers
from snippets.models import Snippet
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = '__all__'