Django RESTFramework——更新数据 (5)

完整实例

项目结构
    Floral
        Floral
        accounts
        manage.py
Floral/urls.py
from django.conf.urls import url, include
from rest_framework import routers
from accounts import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'ips', views.IpViewSet)
router.register(r'comments', views.CommentViewSet)

Floral/accounts/models.py
from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractBaseUser

from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _

class MyUsers(models.Model):
    #REQUIRED_FIELDS = ('name',)
    #USERNAME_FIELD = ('name')
    groups = models.ForeignKey(
        'Groups',
        null=False,
        blank=False,
        related_name='myusers',
        on_delete=models.CASCADE
    )
    name = models.CharField(
        null=False,
        blank=False,
        max_length=125,
    )
    email = models.EmailField(
        null=False,
        blank=False,
        max_length=125,
    )

    url = models.URLField(
        null=False,
        blank=True,
        max_length=125,
    )


class Groups(models.Model):
    name = models.CharField(
        null=False,
        blank=False,
        max_length=125,
    )

    url = models.URLField(
        null=False,
        blank=True,
        max_length=125,
    )

class Ip(models.Model):
    user = models.ForeignKey(
        'MyUsers',
        null=False,
        blank=False,
        related_name='ips',
        on_delete=models.CASCADE
    )
    group = models.ForeignKey(
        'Groups',
        null=False,
        blank=True,
        related_name='ips',
        on_delete=models.CASCADE
    )
    ip_addr = models.GenericIPAddressField(
        blank=False,
        null=False,
    )

class Comment(models.Model):
    email = models.EmailField(
        null=False,
        blank=False,
        max_length=125,
    )
    content = models.CharField(
        null=False,
        blank=False,
        max_length=200,
    )

    created = models.DateTimeField(
        help_text=_('date'),
        auto_now_add=True
    )

    user = models.ForeignKey(
        'MyUsers',
        null=False,
        blank=False,
        related_name='comments',
        on_delete=models.CASCADE
    )


Floral/accounts/views.py
from django.shortcuts import render
# Create your views here.
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from accounts.serializers import UserSerializer, GroupSerializer, IpSerializer, CommentSerializer
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from knox.auth import TokenAuthentication
from knox.models import AuthToken
from rest_framework.permissions import IsAuthenticated, AllowAny
from accounts.models import Ip, Comment

class GroupViewSet(viewsets.ModelViewSet):
    """
    允许组查看或编辑的API路径。
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

class IpViewSet(viewsets.ModelViewSet):
    """
    允许组查看或编辑的API路径。
    """
    queryset = Ip.objects.all()
    serializer_class = IpSerializer

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

Floral/accounts/serializers.py
from django.contrib.auth.models import User, Group
from rest_framework import serializers
from accounts.models import Ip
from rest_framework.response import Response

from datetime import datetime
from rest_framework.renderers import  JSONRenderer
from rest_framework.parsers import JSONParser
from django.utils.six import BytesIO


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups', 'user')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')


class IpSerializer(serializers.HyperlinkedModelSerializer):
    #SerializerMethodField(): Serialization and deserialization
    group = serializers.SerializerMethodField()
    user = serializers.SerializerMethodField()

    class Meta:
        model = Ip
        fields = ('user',  'ip_addr', 'group')

    def get_group(self, obj):
        group = obj.group
        return{'url': group.url,
               'name': group.name,
              }

    def get_user(self, obj):
        user = obj.user
        if user:
            print(1)
        return {
            'name': user.name + ' ' + 'hello'
        }

    def get_attribute(self, instance):
        a = instance
        print(a)
        return instance


class Comment(object):
    def __init__(self, email, content, created=None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()
    
    def create(self, validated_data):
        return Comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance

comment = Comment('1111@qq.com', content='foo bar')
serializer = CommentSerializer(comment)
s = serializer.data
json = JSONRenderer().render(s)

stream = BytesIO(json)
data = JSONParser().parse(stream)
print(data)
serializer = CommentSerializer(data=data)
serializer.is_valid()
k = serializer.validated_data
print(k)

复制代码

访问http://127.0.0.1:8000/comments/1/

PATCH http://127.0.0.1:8000/comments/1/ 更新部分数据(可以是单条数据) 对应于drf中的update方法

具体的HTTP方法和drff中的操作对应关系参考https://www.jianshu.com/p/69bdfc531f48

使用postman测结果

https://note.youdao.com/yws/res/32204/WEBRESOURCE57124744967a96fa0af039a2aff731a3

如果Comment是一个模型Model

    def create(self, validated_data):
        return Comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance
可以更改为

    def create(self, validated_data):
        return Comment.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        instance.save()
        return instance

如果你的对象实例对应Django的模型,你还需要确保这些方法将对象保存到数据库。
例如,如果Comment是一个Django模型的话。
【Django rest framework 官方文档解释】
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值