{"id":5894,"date":"2022-04-03T13:17:50","date_gmt":"2022-04-03T05:17:50","guid":{"rendered":"https:\/\/egonlin.com\/?p=5894"},"modified":"2022-04-03T13:17:50","modified_gmt":"2022-04-03T05:17:50","slug":"03-01-serializer%e7%bb%84%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=5894","title":{"rendered":"03-01 Serializer\u7ec4\u4ef6"},"content":{"rendered":"<h1>\u5e8f\u5217\u5316\u5668-Serializer<\/h1>\n<h2>1\u5b9a\u4e49\u5e8f\u5217\u5316\u5668<\/h2>\n<p>Django REST framework\u4e2d\u7684Serializer\u4f7f\u7528\u7c7b\u6765\u5b9a\u4e49\uff0c\u987b\u7ee7\u627f\u81earest_framework.serializers.Serializer\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u6211\u4eec\u5df2\u6709\u4e86\u4e00\u4e2a\u6570\u636e\u5e93\u6a21\u578b\u7c7bBookInfo<\/p>\n<pre><code class=\"language-python\">class BookInfo(models.Model):\n    btitle = models.CharField(max_length=20, verbose_name=&#039;\u540d\u79f0&#039;)\n    bpub_date = models.DateField(verbose_name=&#039;\u53d1\u5e03\u65e5\u671f&#039;, null=True)\n    bread = models.IntegerField(default=0, verbose_name=&#039;\u9605\u8bfb\u91cf&#039;)\n    bcomment = models.IntegerField(default=0, verbose_name=&#039;\u8bc4\u8bba\u91cf&#039;)\n    image = models.ImageField(upload_to=&#039;booktest&#039;, verbose_name=&#039;\u56fe\u7247&#039;, null=True)<\/code><\/pre>\n<p>\u6211\u4eec\u60f3\u4e3a\u8fd9\u4e2a\u6a21\u578b\u7c7b\u63d0\u4f9b\u4e00\u4e2a\u5e8f\u5217\u5316\u5668\uff0c\u53ef\u4ee5\u5b9a\u4e49\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    id = serializers.IntegerField(label=&#039;ID&#039;, read_only=True)\n    btitle = serializers.CharField(label=&#039;\u540d\u79f0&#039;, max_length=20)\n    bpub_date = serializers.DateField(label=&#039;\u53d1\u5e03\u65e5\u671f&#039;, required=False)\n    bread = serializers.IntegerField(label=&#039;\u9605\u8bfb\u91cf&#039;, required=False)\n    bcomment = serializers.IntegerField(label=&#039;\u8bc4\u8bba\u91cf&#039;, required=False)\n    image = serializers.ImageField(label=&#039;\u56fe\u7247&#039;, required=False)<\/code><\/pre>\n<p><strong>\u6ce8\u610f\uff1aserializer\u4e0d\u662f\u53ea\u80fd\u4e3a\u6570\u636e\u5e93\u6a21\u578b\u7c7b\u5b9a\u4e49\uff0c\u4e5f\u53ef\u4ee5\u4e3a\u975e\u6570\u636e\u5e93\u6a21\u578b\u7c7b\u7684\u6570\u636e\u5b9a\u4e49\u3002<\/strong>serializer\u662f\u72ec\u7acb\u4e8e\u6570\u636e\u5e93\u4e4b\u5916\u7684\u5b58\u5728\u3002<\/p>\n<p><strong>\u5e38\u7528\u5b57\u6bb5\u7c7b\u578b<\/strong>\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u5b57\u6bb5<\/th>\n<th>\u5b57\u6bb5\u6784\u9020\u65b9\u5f0f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>BooleanField<\/strong><\/td>\n<td>BooleanField()<\/td>\n<\/tr>\n<tr>\n<td><strong>NullBooleanField<\/strong><\/td>\n<td>NullBooleanField()<\/td>\n<\/tr>\n<tr>\n<td><strong>CharField<\/strong><\/td>\n<td>CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)<\/td>\n<\/tr>\n<tr>\n<td><strong>EmailField<\/strong><\/td>\n<td>EmailField(max_length=None, min_length=None, allow_blank=False)<\/td>\n<\/tr>\n<tr>\n<td><strong>RegexField<\/strong><\/td>\n<td>RegexField(regex, max_length=None, min_length=None, allow_blank=False)<\/td>\n<\/tr>\n<tr>\n<td><strong>SlugField<\/strong><\/td>\n<td>SlugField(max_length=50, min_length=None, allow_blank=False) \u6b63\u5219\u5b57\u6bb5\uff0c\u9a8c\u8bc1\u6b63\u5219\u6a21\u5f0f [a-zA-Z0-9*-]+<\/td>\n<\/tr>\n<tr>\n<td><strong>URLField<\/strong><\/td>\n<td>URLField(max_length=200, min_length=None, allow_blank=False)<\/td>\n<\/tr>\n<tr>\n<td><strong>UUIDField<\/strong><\/td>\n<td>UUIDField(format=&#8217;hex_verbose&#8217;)  format:  1) <code>&#039;hex_verbose&#039;<\/code> \u5982<code>&quot;5ce0e9a5-5ffa-654b-cee0-1238041fb31a&quot;<\/code>  2\uff09 <code>&#039;hex&#039;<\/code> \u5982 <code>&quot;5ce0e9a55ffa654bcee01238041fb31a&quot;<\/code>  3\uff09<code>&#039;int&#039;<\/code> &#8211; \u5982: <code>&quot;123456789012312313134124512351145145114&quot;<\/code>  4\uff09<code>&#039;urn&#039;<\/code> \u5982: <code>&quot;urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a&quot;<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>IPAddressField<\/strong><\/td>\n<td>IPAddressField(protocol=&#8217;both&#8217;, unpack_ipv4=False, **options)<\/td>\n<\/tr>\n<tr>\n<td><strong>IntegerField<\/strong><\/td>\n<td>IntegerField(max_value=None, min_value=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>FloatField<\/strong><\/td>\n<td>FloatField(max_value=None, min_value=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>DecimalField<\/strong><\/td>\n<td>DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: \u6700\u591a\u4f4d\u6570 decimal_palces: \u5c0f\u6570\u70b9\u4f4d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td><strong>DateTimeField<\/strong><\/td>\n<td>DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>DateField<\/strong><\/td>\n<td>DateField(format=api_settings.DATE_FORMAT, input_formats=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>TimeField<\/strong><\/td>\n<td>TimeField(format=api_settings.TIME_FORMAT, input_formats=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>DurationField<\/strong><\/td>\n<td>DurationField()<\/td>\n<\/tr>\n<tr>\n<td><strong>ChoiceField<\/strong><\/td>\n<td>ChoiceField(choices) choices\u4e0eDjango\u7684\u7528\u6cd5\u76f8\u540c<\/td>\n<\/tr>\n<tr>\n<td><strong>MultipleChoiceField<\/strong><\/td>\n<td>MultipleChoiceField(choices)<\/td>\n<\/tr>\n<tr>\n<td><strong>FileField<\/strong><\/td>\n<td>FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)<\/td>\n<\/tr>\n<tr>\n<td><strong>ImageField<\/strong><\/td>\n<td>ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)<\/td>\n<\/tr>\n<tr>\n<td><strong>ListField<\/strong><\/td>\n<td>ListField(child=, min_length=None, max_length=None)<\/td>\n<\/tr>\n<tr>\n<td><strong>DictField<\/strong><\/td>\n<td>DictField(child=)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u9009\u9879\u53c2\u6570\uff1a<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d\u79f0<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>max_length<\/strong><\/td>\n<td>\u6700\u5927\u957f\u5ea6<\/td>\n<\/tr>\n<tr>\n<td><strong>min_lenght<\/strong><\/td>\n<td>\u6700\u5c0f\u957f\u5ea6<\/td>\n<\/tr>\n<tr>\n<td><strong>allow_blank<\/strong><\/td>\n<td>\u662f\u5426\u5141\u8bb8\u4e3a\u7a7a<\/td>\n<\/tr>\n<tr>\n<td><strong>trim_whitespace<\/strong><\/td>\n<td>\u662f\u5426\u622a\u65ad\u7a7a\u767d\u5b57\u7b26<\/td>\n<\/tr>\n<tr>\n<td><strong>max_value<\/strong><\/td>\n<td>\u6700\u5c0f\u503c<\/td>\n<\/tr>\n<tr>\n<td><strong>min_value<\/strong><\/td>\n<td>\u6700\u5927\u503c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u901a\u7528\u53c2\u6570\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d\u79f0<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>read_only<\/strong><\/td>\n<td>\u8868\u660e\u8be5\u5b57\u6bb5\u4ec5\u7528\u4e8e\u5e8f\u5217\u5316\u8f93\u51fa\uff0c\u9ed8\u8ba4False<\/td>\n<\/tr>\n<tr>\n<td><strong>write_only<\/strong><\/td>\n<td>\u8868\u660e\u8be5\u5b57\u6bb5\u4ec5\u7528\u4e8e\u53cd\u5e8f\u5217\u5316\u8f93\u5165\uff0c\u9ed8\u8ba4False<\/td>\n<\/tr>\n<tr>\n<td><strong>required<\/strong><\/td>\n<td>\u8868\u660e\u8be5\u5b57\u6bb5\u5728\u53cd\u5e8f\u5217\u5316\u65f6\u5fc5\u987b\u8f93\u5165\uff0c\u9ed8\u8ba4True<\/td>\n<\/tr>\n<tr>\n<td><strong>default<\/strong><\/td>\n<td>\u53cd\u5e8f\u5217\u5316\u65f6\u4f7f\u7528\u7684\u9ed8\u8ba4\u503c<\/td>\n<\/tr>\n<tr>\n<td><strong>allow_null<\/strong><\/td>\n<td>\u8868\u660e\u8be5\u5b57\u6bb5\u662f\u5426\u5141\u8bb8\u4f20\u5165None\uff0c\u9ed8\u8ba4False<\/td>\n<\/tr>\n<tr>\n<td><strong>validators<\/strong><\/td>\n<td>\u8be5\u5b57\u6bb5\u4f7f\u7528\u7684\u9a8c\u8bc1\u5668<\/td>\n<\/tr>\n<tr>\n<td><strong>error_messages<\/strong><\/td>\n<td>\u5305\u542b\u9519\u8bef\u7f16\u53f7\u4e0e\u9519\u8bef\u4fe1\u606f\u7684\u5b57\u5178<\/td>\n<\/tr>\n<tr>\n<td><strong>label<\/strong><\/td>\n<td>\u7528\u4e8eHTML\u5c55\u793aAPI\u9875\u9762\u65f6\uff0c\u663e\u793a\u7684\u5b57\u6bb5\u540d\u79f0<\/td>\n<\/tr>\n<tr>\n<td><strong>help_text<\/strong><\/td>\n<td>\u7528\u4e8eHTML\u5c55\u793aAPI\u9875\u9762\u65f6\uff0c\u663e\u793a\u7684\u5b57\u6bb5\u5e2e\u52a9\u63d0\u793a\u4fe1\u606f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>2\u3001\u521b\u5efaSerializer\u5bf9\u8c61<\/h2>\n<p>\u5b9a\u4e49\u597dSerializer\u7c7b\u540e\uff0c\u5c31\u53ef\u4ee5\u521b\u5efaSerializer\u5bf9\u8c61\u4e86\u3002<\/p>\n<p>Serializer\u7684\u6784\u9020\u65b9\u6cd5\u4e3a\uff1a<\/p>\n<pre><code class=\"language-python\">Serializer(instance=None, data=empty, **kwarg)<\/code><\/pre>\n<p>\u8bf4\u660e\uff1a<\/p>\n<p>1\uff09\u7528\u4e8e\u5e8f\u5217\u5316\u65f6\uff0c\u5c06\u6a21\u578b\u7c7b\u5bf9\u8c61\u4f20\u5165<strong>instance<\/strong>\u53c2\u6570<\/p>\n<p>2\uff09\u7528\u4e8e\u53cd\u5e8f\u5217\u5316\u65f6\uff0c\u5c06\u8981\u88ab\u53cd\u5e8f\u5217\u5316\u7684\u6570\u636e\u4f20\u5165<strong>data<\/strong>\u53c2\u6570<\/p>\n<p>3\uff09\u9664\u4e86instance\u548cdata\u53c2\u6570\u5916\uff0c\u5728\u6784\u9020Serializer\u5bf9\u8c61\u65f6\uff0c\u8fd8\u53ef\u901a\u8fc7<strong>context<\/strong>\u53c2\u6570\u989d\u5916\u6dfb\u52a0\u6570\u636e\uff0c\u5982<\/p>\n<pre><code class=\"language-python\">serializer = AccountSerializer(account, context={&#039;request&#039;: request})<\/code><\/pre>\n<p><strong>\u901a\u8fc7context\u53c2\u6570\u9644\u52a0\u7684\u6570\u636e\uff0c\u53ef\u4ee5\u901a\u8fc7Serializer\u5bf9\u8c61\u7684context\u5c5e\u6027\u83b7\u53d6\u3002<\/strong><\/p>\n<ol>\n<li>\u4f7f\u7528\u5e8f\u5217\u5316\u5668\u7684\u65f6\u5019\u4e00\u5b9a\u8981\u6ce8\u610f\uff0c\u5e8f\u5217\u5316\u5668\u58f0\u660e\u4e86\u4ee5\u540e\uff0c\u4e0d\u4f1a\u81ea\u52a8\u6267\u884c\uff0c\u9700\u8981\u6211\u4eec\u5728\u89c6\u56fe\u4e2d\u8fdb\u884c\u8c03\u7528\u624d\u53ef\u4ee5\u3002<\/li>\n<li>\u5e8f\u5217\u5316\u5668\u65e0\u6cd5\u76f4\u63a5\u63a5\u6536\u6570\u636e\uff0c\u9700\u8981\u6211\u4eec\u5728\u89c6\u56fe\u4e2d\u521b\u5efa\u5e8f\u5217\u5316\u5668\u5bf9\u8c61\u65f6\u628a\u4f7f\u7528\u7684\u6570\u636e\u4f20\u9012\u8fc7\u6765\u3002<\/li>\n<li>\u5e8f\u5217\u5316\u5668\u7684\u5b57\u6bb5\u58f0\u660e\u7c7b\u4f3c\u4e8e\u6211\u4eec\u524d\u9762\u4f7f\u7528\u8fc7\u7684\u8868\u5355\u7cfb\u7edf\u3002<\/li>\n<li>\u5f00\u53d1restful api\u65f6\uff0c\u5e8f\u5217\u5316\u5668\u4f1a\u5e2e\u6211\u4eec\u628a\u6a21\u578b\u6570\u636e\u8f6c\u6362\u6210\u5b57\u5178.<\/li>\n<li>drf\u63d0\u4f9b\u7684\u89c6\u56fe\u4f1a\u5e2e\u6211\u4eec\u628a\u5b57\u5178\u8f6c\u6362\u6210json,\u6216\u8005\u628a\u5ba2\u6237\u7aef\u53d1\u9001\u8fc7\u6765\u7684\u6570\u636e\u8f6c\u6362\u5b57\u5178.<\/li>\n<\/ol>\n<h2>3\u3001\u5e8f\u5217\u5316\u5668\u7684\u4f7f\u7528<\/h2>\n<p>\u5e8f\u5217\u5316\u5668\u7684\u4f7f\u7528\u5206\u4e24\u4e2a\u9636\u6bb5\uff1a<\/p>\n<ol>\n<li>\u5728\u5ba2\u6237\u7aef\u8bf7\u6c42\u65f6\uff0c\u4f7f\u7528\u5e8f\u5217\u5316\u5668\u53ef\u4ee5\u5b8c\u6210\u5bf9\u6570\u636e\u7684\u53cd\u5e8f\u5217\u5316\u3002<\/li>\n<li>\u5728\u670d\u52a1\u5668\u54cd\u5e94\u65f6\uff0c\u4f7f\u7528\u5e8f\u5217\u5316\u5668\u53ef\u4ee5\u5b8c\u6210\u5bf9\u6570\u636e\u7684\u5e8f\u5217\u5316\u3002<\/li>\n<\/ol>\n<h4>\u5e8f\u5217\u5316<\/h4>\n<h5>\u57fa\u672c\u4f7f\u7528<\/h5>\n<p>1\uff09 \u5148\u67e5\u8be2\u51fa\u4e00\u4e2a\u56fe\u4e66\u5bf9\u8c61<\/p>\n<pre><code class=\"language-python\">from booktest.models import BookInfo\n\nbook = BookInfo.objects.get(id=2)<\/code><\/pre>\n<p>2\uff09 \u6784\u9020\u5e8f\u5217\u5316\u5668\u5bf9\u8c61<\/p>\n<pre><code class=\"language-python\">from booktest.serializers import BookInfoSerializer\n\nserializer = BookInfoSerializer(book)<\/code><\/pre>\n<p>3\uff09\u83b7\u53d6\u5e8f\u5217\u5316\u6570\u636e<\/p>\n<p>\u901a\u8fc7data\u5c5e\u6027\u53ef\u4ee5\u83b7\u53d6\u5e8f\u5217\u5316\u540e\u7684\u6570\u636e<\/p>\n<pre><code class=\"language-python\">serializer.data\n# {&#039;id&#039;: 2, &#039;btitle&#039;: &#039;\u5929\u9f99\u516b\u90e8&#039;, &#039;bpub_date&#039;: &#039;1986-07-24&#039;, &#039;bread&#039;: 36, &#039;bcomment&#039;: 40, &#039;image&#039;: None}<\/code><\/pre>\n<p>4\uff09\u5982\u679c\u8981\u88ab\u5e8f\u5217\u5316\u7684\u662f\u5305\u542b\u591a\u6761\u6570\u636e\u7684\u67e5\u8be2\u96c6QuerySet\uff0c\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0<strong>many=True<\/strong>\u53c2\u6570\u8865\u5145\u8bf4\u660e<\/p>\n<pre><code class=\"language-python\">book_qs = BookInfo.objects.all()\nserializer = BookInfoSerializer(book_qs, many=True)\nserializer.data\n# [OrderedDict([(&#039;id&#039;, 2), (&#039;btitle&#039;, &#039;\u5929\u9f99\u516b\u90e8&#039;), (&#039;bpub_date&#039;, &#039;1986-07-24&#039;), (&#039;bread&#039;, 36), (&#039;bcomment&#039;, 40), (&#039;image&#039;, N]), OrderedDict([(&#039;id&#039;, 3), (&#039;btitle&#039;, &#039;\u7b11\u50b2\u6c5f\u6e56&#039;), (&#039;bpub_date&#039;, &#039;1995-12-24&#039;), (&#039;bread&#039;, 20), (&#039;bcomment&#039;, 80), (&#039;image&#039;ne)]), OrderedDict([(&#039;id&#039;, 4), (&#039;btitle&#039;, &#039;\u96ea\u5c71\u98de\u72d0&#039;), (&#039;bpub_date&#039;, &#039;1987-11-11&#039;), (&#039;bread&#039;, 58), (&#039;bcomment&#039;, 24), (&#039;ima None)]), OrderedDict([(&#039;id&#039;, 5), (&#039;btitle&#039;, &#039;\u897f\u6e38\u8bb0&#039;), (&#039;bpub_date&#039;, &#039;1988-01-01&#039;), (&#039;bread&#039;, 10), (&#039;bcomment&#039;, 10), (&#039;im&#039;, &#039;booktest\/xiyouji.png&#039;)])]<\/code><\/pre>\n<h4>\u53cd\u5e8f\u5217\u5316<\/h4>\n<h5>\u6570\u636e\u9a8c\u8bc1<\/h5>\n<p>\u4f7f\u7528\u5e8f\u5217\u5316\u5668\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u65f6\uff0c\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u9a8c\u8bc1\u540e\uff0c\u624d\u80fd\u83b7\u53d6\u9a8c\u8bc1\u6210\u529f\u7684\u6570\u636e\u6216\u4fdd\u5b58\u6210\u6a21\u578b\u7c7b\u5bf9\u8c61\u3002<\/p>\n<p>\u5728\u83b7\u53d6\u53cd\u5e8f\u5217\u5316\u7684\u6570\u636e\u524d\uff0c\u5fc5\u987b\u8c03\u7528<strong>is_valid()<\/strong>\u65b9\u6cd5\u8fdb\u884c\u9a8c\u8bc1\uff0c\u9a8c\u8bc1\u6210\u529f\u8fd4\u56deTrue\uff0c\u5426\u5219\u8fd4\u56deFalse\u3002<\/p>\n<p>\u9a8c\u8bc1\u5931\u8d25\uff0c\u53ef\u4ee5\u901a\u8fc7\u5e8f\u5217\u5316\u5668\u5bf9\u8c61\u7684<strong>errors<\/strong>\u5c5e\u6027\u83b7\u53d6\u9519\u8bef\u4fe1\u606f\uff0c\u8fd4\u56de\u5b57\u5178\uff0c\u5305\u542b\u4e86\u5b57\u6bb5\u548c\u5b57\u6bb5\u7684\u9519\u8bef\u3002\u5982\u679c\u662f\u975e\u5b57\u6bb5\u9519\u8bef\uff0c\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539REST framework\u914d\u7f6e\u4e2d\u7684<strong>NON_FIELD_ERRORS_KEY<\/strong>\u6765\u63a7\u5236\u9519\u8bef\u5b57\u5178\u4e2d\u7684\u952e\u540d\u3002<\/p>\n<p>\u9a8c\u8bc1\u6210\u529f\uff0c\u53ef\u4ee5\u901a\u8fc7\u5e8f\u5217\u5316\u5668\u5bf9\u8c61\u7684<strong>validated_data<\/strong>\u5c5e\u6027\u83b7\u53d6\u6570\u636e\u3002<\/p>\n<p>\u5728\u5b9a\u4e49\u5e8f\u5217\u5316\u5668\u65f6\uff0c\u6307\u660e\u6bcf\u4e2a\u5b57\u6bb5\u7684\u5e8f\u5217\u5316\u7c7b\u578b\u548c\u9009\u9879\u53c2\u6570\uff0c\u672c\u8eab\u5c31\u662f\u4e00\u79cd\u9a8c\u8bc1\u884c\u4e3a\u3002<\/p>\n<p>\u5982\u6211\u4eec\u524d\u9762\u5b9a\u4e49\u8fc7\u7684BookInfoSerializer<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    id = serializers.IntegerField(label=&#039;ID&#039;, read_only=True)\n    btitle = serializers.CharField(label=&#039;\u540d\u79f0&#039;, max_length=20)\n    bpub_date = serializers.DateField(label=&#039;\u53d1\u5e03\u65e5\u671f&#039;, required=False)\n    bread = serializers.IntegerField(label=&#039;\u9605\u8bfb\u91cf&#039;, required=False)\n    bcomment = serializers.IntegerField(label=&#039;\u8bc4\u8bba\u91cf&#039;, required=False)\n    image = serializers.ImageField(label=&#039;\u56fe\u7247&#039;, required=False)<\/code><\/pre>\n<p>\u901a\u8fc7\u6784\u9020\u5e8f\u5217\u5316\u5668\u5bf9\u8c61\uff0c\u5e76\u5c06\u8981\u53cd\u5e8f\u5217\u5316\u7684\u6570\u636e\u4f20\u9012\u7ed9data\u6784\u9020\u53c2\u6570\uff0c\u8fdb\u800c\u8fdb\u884c\u9a8c\u8bc1<\/p>\n<pre><code class=\"language-python\">from booktest.serializers import BookInfoSerializer\ndata = {&#039;bpub_date&#039;: 123}\nserializer = BookInfoSerializer(data=data)\nserializer.is_valid()  # \u8fd4\u56deFalse\nserializer.errors\n# {&#039;btitle&#039;: [ErrorDetail(string=&#039;This field is required.&#039;, code=&#039;required&#039;)], &#039;bpub_date&#039;: [ErrorDetail(string=&#039;Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].&#039;, code=&#039;invalid&#039;)]}\nserializer.validated_data  # {}\n\ndata = {&#039;btitle&#039;: &#039;python&#039;}\nserializer = BookInfoSerializer(data=data)\nserializer.is_valid()  # True\nserializer.errors  # {}\nserializer.validated_data  #  OrderedDict([(&#039;btitle&#039;, &#039;python&#039;)])<\/code><\/pre>\n<p>is_valid()\u65b9\u6cd5\u8fd8\u53ef\u4ee5\u5728\u9a8c\u8bc1\u5931\u8d25\u65f6\u629b\u51fa\u5f02\u5e38serializers.ValidationError\uff0c\u53ef\u4ee5\u901a\u8fc7\u4f20\u9012<strong>raise_exception=True<\/strong>\u53c2\u6570\u5f00\u542f\uff0cREST framework\u63a5\u6536\u5230\u6b64\u5f02\u5e38\uff0c\u4f1a\u5411\u524d\u7aef\u8fd4\u56deHTTP 400 Bad Request\u54cd\u5e94\u3002<\/p>\n<pre><code class=\"language-python\"># Return a 400 response if the data was invalid.\nserializer.is_valid(raise_exception=True)<\/code><\/pre>\n<p>\u5982\u679c\u89c9\u5f97\u8fd9\u4e9b\u8fd8\u4e0d\u591f\uff0c\u9700\u8981\u518d\u8865\u5145\u5b9a\u4e49\u9a8c\u8bc1\u884c\u4e3a\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u4e09\u79cd\u65b9\u6cd5\uff1a<\/p>\n<h5>1) validate_\u5b57\u6bb5\u540d<\/h5>\n<p>\u5bf9<code>&lt;field_name&gt;<\/code>\u5b57\u6bb5\u8fdb\u884c\u9a8c\u8bc1\uff0c\u5982<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    ...\n\n    def validate_btitle(self, value):\n        if &#039;django&#039; not in value.lower():\n            raise serializers.ValidationError(&quot;\u56fe\u4e66\u4e0d\u662f\u5173\u4e8eDjango\u7684&quot;)\n        return value<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<pre><code class=\"language-python\">from booktest.serializers import BookInfoSerializer\ndata = {&#039;btitle&#039;: &#039;python&#039;}\nserializer = BookInfoSerializer(data=data)\nserializer.is_valid()  # False   \nserializer.errors\n#  {&#039;btitle&#039;: [ErrorDetail(string=&#039;\u56fe\u4e66\u4e0d\u662f\u5173\u4e8eDjango\u7684&#039;, code=&#039;invalid&#039;)]}<\/code><\/pre>\n<h5>2) validate<\/h5>\n<p>\u5728\u5e8f\u5217\u5316\u5668\u4e2d\u9700\u8981\u540c\u65f6\u5bf9\u591a\u4e2a\u5b57\u6bb5\u8fdb\u884c\u6bd4\u8f83\u9a8c\u8bc1\u65f6\uff0c\u53ef\u4ee5\u5b9a\u4e49validate\u65b9\u6cd5\u6765\u9a8c\u8bc1\uff0c\u5982<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    ...\n\n    def validate(self, attrs):\n        bread = attrs[&#039;bread&#039;]\n        bcomment = attrs[&#039;bcomment&#039;]\n        if bread &lt; bcomment:\n            raise serializers.ValidationError(&#039;\u9605\u8bfb\u91cf\u5c0f\u4e8e\u8bc4\u8bba\u91cf&#039;)\n        return attrs<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<pre><code class=\"language-python\">from booktest.serializers import BookInfoSerializer\ndata = {&#039;btitle&#039;: &#039;about django&#039;, &#039;bread&#039;: 10, &#039;bcomment&#039;: 20}\ns = BookInfoSerializer(data=data)\ns.is_valid()  # False\ns.errors\n#  {&#039;non_field_errors&#039;: [ErrorDetail(string=&#039;\u9605\u8bfb\u91cf\u5c0f\u4e8e\u8bc4\u8bba\u91cf&#039;, code=&#039;invalid&#039;)]}<\/code><\/pre>\n<h5>3) validators<\/h5>\n<p>\u5728\u5b57\u6bb5\u4e2d\u6dfb\u52a0validators\u9009\u9879\u53c2\u6570\uff0c\u4e5f\u53ef\u4ee5\u8865\u5145\u9a8c\u8bc1\u884c\u4e3a\uff0c\u5982<\/p>\n<pre><code class=\"language-python\">def about_django(value):\n    if &#039;django&#039; not in value.lower():\n        raise serializers.ValidationError(&quot;\u56fe\u4e66\u4e0d\u662f\u5173\u4e8eDjango\u7684&quot;)\n\nclass BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    id = serializers.IntegerField(label=&#039;ID&#039;, read_only=True)\n    btitle = serializers.CharField(label=&#039;\u540d\u79f0&#039;, max_length=20, validators=[about_django])\n    bpub_date = serializers.DateField(label=&#039;\u53d1\u5e03\u65e5\u671f&#039;, required=False)\n    bread = serializers.IntegerField(label=&#039;\u9605\u8bfb\u91cf&#039;, required=False)\n    bcomment = serializers.IntegerField(label=&#039;\u8bc4\u8bba\u91cf&#039;, required=False)\n    image = serializers.ImageField(label=&#039;\u56fe\u7247&#039;, required=False)<\/code><\/pre>\n<p>\u6d4b\u8bd5\uff1a<\/p>\n<pre><code class=\"language-python\">from booktest.serializers import BookInfoSerializer\ndata = {&#039;btitle&#039;: &#039;python&#039;}\nserializer = BookInfoSerializer(data=data)\nserializer.is_valid()  # False   \nserializer.errors\n#  {&#039;btitle&#039;: [ErrorDetail(string=&#039;\u56fe\u4e66\u4e0d\u662f\u5173\u4e8eDjango\u7684&#039;, code=&#039;invalid&#039;)]}<\/code><\/pre>\n<h4>\u53cd\u5e8f\u5217\u5316-\u4fdd\u5b58\u6570\u636e<\/h4>\n<p>\u524d\u9762\u7684\u9a8c\u8bc1\u6570\u636e\u6210\u529f\u540e,\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5e8f\u5217\u5316\u5668\u6765\u5b8c\u6210\u6570\u636e\u53cd\u5e8f\u5217\u5316\u7684\u8fc7\u7a0b.\u8fd9\u4e2a\u8fc7\u7a0b\u53ef\u4ee5\u628a\u6570\u636e\u8f6c\u6210\u6a21\u578b\u7c7b\u5bf9\u8c61.<\/p>\n<p>\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0create()\u548cupdate()\u4e24\u4e2a\u65b9\u6cd5\u6765\u5b9e\u73b0\u3002<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    ...\n\n    def create(self, validated_data):\n        &quot;&quot;&quot;\u65b0\u5efa&quot;&quot;&quot;\n        return BookInfo(**validated_data)\n\n    def update(self, instance, validated_data):\n        &quot;&quot;&quot;\u66f4\u65b0\uff0cinstance\u4e3a\u8981\u66f4\u65b0\u7684\u5bf9\u8c61\u5b9e\u4f8b&quot;&quot;&quot;\n        instance.btitle = validated_data.get(&#039;btitle&#039;, instance.btitle)\n        instance.bpub_date = validated_data.get(&#039;bpub_date&#039;, instance.bpub_date)\n        instance.bread = validated_data.get(&#039;bread&#039;, instance.bread)\n        instance.bcomment = validated_data.get(&#039;bcomment&#039;, instance.bcomment)\n        return instance<\/code><\/pre>\n<p>\u5982\u679c\u9700\u8981\u5728\u8fd4\u56de\u6570\u636e\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4e5f\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u6570\u636e\u5e93\u4e2d\uff0c\u5219\u53ef\u4ee5\u8fdb\u884c\u5982\u4e0b\u4fee\u6539<\/p>\n<pre><code class=\"language-python\">class BookInfoSerializer(serializers.Serializer):\n    &quot;&quot;&quot;\u56fe\u4e66\u6570\u636e\u5e8f\u5217\u5316\u5668&quot;&quot;&quot;\n    ...\n\n    def create(self, validated_data):\n        &quot;&quot;&quot;\u65b0\u5efa&quot;&quot;&quot;\n        return BookInfo.objects.create(**validated_data)\n\n    def update(self, instance, validated_data):\n        &quot;&quot;&quot;\u66f4\u65b0\uff0cinstance\u4e3a\u8981\u66f4\u65b0\u7684\u5bf9\u8c61\u5b9e\u4f8b&quot;&quot;&quot;\n        instance.btitle = validated_data.get(&#039;btitle&#039;, instance.btitle)\n        instance.bpub_date = validated_data.get(&#039;bpub_date&#039;, instance.bpub_date)\n        instance.bread = validated_data.get(&#039;bread&#039;, instance.bread)\n        instance.bcomment = validated_data.get(&#039;bcomment&#039;, instance.bcomment)\n        instance.save()\n        return instance<\/code><\/pre>\n<p>\u5b9e\u73b0\u4e86\u4e0a\u8ff0\u4e24\u4e2a\u65b9\u6cd5\u540e\uff0c\u5728\u53cd\u5e8f\u5217\u5316\u6570\u636e\u7684\u65f6\u5019\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7save()\u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a\u6570\u636e\u5bf9\u8c61\u5b9e\u4f8b\u4e86<\/p>\n<pre><code class=\"language-python\">book = serializer.save()<\/code><\/pre>\n<p>\u5982\u679c\u521b\u5efa\u5e8f\u5217\u5316\u5668\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u6ca1\u6709\u4f20\u9012instance\u5b9e\u4f8b\uff0c\u5219\u8c03\u7528save()\u65b9\u6cd5\u7684\u65f6\u5019\uff0ccreate()\u88ab\u8c03\u7528\uff0c\u76f8\u53cd\uff0c\u5982\u679c\u4f20\u9012\u4e86instance\u5b9e\u4f8b\uff0c\u5219\u8c03\u7528save()\u65b9\u6cd5\u7684\u65f6\u5019\uff0cupdate()\u88ab\u8c03\u7528\u3002<\/p>\n<pre><code class=\"language-python\">from db.serializers import BookInfoSerializer\ndata = {&#039;btitle&#039;: &#039;\u5c01\u795e\u6f14\u4e49&#039;}\nserializer = BookInfoSerializer(data=data)\nserializer.is_valid()  # True\nserializer.save()  # &lt;BookInfo: \u5c01\u795e\u6f14\u4e49&gt;\n\nfrom db.models import BookInfo\nbook = BookInfo.objects.get(id=2)\ndata = {&#039;btitle&#039;: &#039;\u501a\u5929\u5251&#039;}\nserializer = BookInfoSerializer(book, data=data)\nserializer.is_valid()  # True\nserializer.save()  # &lt;BookInfo: \u501a\u5929\u5251&gt;\nbook.btitle  # &#039;\u501a\u5929\u5251&#039;<\/code><\/pre>\n<h2>4\u3001\u9644\u52a0\u8bf4\u660e<\/h2>\n<p>1\uff09 \u5728\u5bf9\u5e8f\u5217\u5316\u5668\u8fdb\u884csave()\u4fdd\u5b58\u65f6\uff0c\u53ef\u4ee5\u989d\u5916\u4f20\u9012\u6570\u636e\uff0c\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u5728create()\u548cupdate()\u4e2d\u7684validated_data\u53c2\u6570\u83b7\u53d6\u5230<\/p>\n<pre><code class=\"language-python\"># request.user \u662fdjango\u4e2d\u8bb0\u5f55\u5f53\u524d\u767b\u5f55\u7528\u6237\u7684\u6a21\u578b\u5bf9\u8c61\nserializer.save(owner=request.user)<\/code><\/pre>\n<p>2\uff09\u9ed8\u8ba4\u5e8f\u5217\u5316\u5668\u5fc5\u987b\u4f20\u9012\u6240\u6709required\u7684\u5b57\u6bb5\uff0c\u5426\u5219\u4f1a\u629b\u51fa\u9a8c\u8bc1\u5f02\u5e38\u3002\u4f46\u662f\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528partial\u53c2\u6570\u6765\u5141\u8bb8\u90e8\u5206\u5b57\u6bb5\u66f4\u65b0<\/p>\n<pre><code class=\"language-python\"># Update `comment` with partial data\nserializer = CommentSerializer(comment, data={&#039;content&#039;: u&#039;foo bar&#039;}, partial=True)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5e8f\u5217\u5316\u5668-Serializer 1\u5b9a\u4e49\u5e8f\u5217\u5316\u5668 Django REST framework\u4e2d\u7684Serializ [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[394,399],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5894"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5894"}],"version-history":[{"count":0,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5894\/revisions"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}