首页 > 其他分享 >django

django

时间:2023-01-24 19:34:03浏览次数:47  
标签:title request value django framework rest import

django serializer中不仅可以定义返回的字段,也可以定义相关重写的方法。

对于不同的数据权限,可以定义不同的数据集feildsets来指向不同的用户拥有的权限。

设置全局权限在setting中:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

当然可以继承一个权限类,重写新的权限:

from rest_framework import permissions


class IsStaffEditorPermission(permissions.DjangoModelPermissions):
    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': [],
        'HEAD': [],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }

随后可以指定一个公用permission类:

from rest_framework import permissions

from .permissions import IsStaffEditorPermission

class StaffEditorPermissionMixin():
    permission_classes = [permissions.IsAdminUser, IsStaffEditorPermission]

在非全局权限的接口中使用它:
这样做是为了防止过多的同样设置的繁琐

from rest_framework import generics, mixins
from rest_framework.decorators import api_view
from rest_framework.response import Response
# from django.http import Http404
from django.shortcuts import get_object_or_404
from api.mixins import (
    StaffEditorPermissionMixin,
    UserQuerySetMixin)

from .models import Product
from .serializers import ProductSerializer

class ProductListCreateAPIView(
    UserQuerySetMixin,
    StaffEditorPermissionMixin,
    generics.ListCreateAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    def perform_create(self, serializer):
        # serializer.save(user=self.request.user)
        title = serializer.validated_data.get('title')
        content = serializer.validated_data.get('content') or None
        if content is None:
            content = title
        serializer.save(user=self.request.user, content=content)

同样的,对于字段校验也是一样:
比如声明一个validators.py

from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from .models import Product

def unique_product_title(value):
    qs = Product.objects.filter(title__iexact=value)
    if qs.exists():
        raise serializers.ValidationError(f"{value} is already a product name.")
    return value

def validate_title_no_hello(value):
    if "hello" in value.lower():
        raise serializers.ValidationError(f"{value} is not allowed")
    return value


unique_product_title = UniqueValidator(queryset=Product.objects.all(), lookup='iexact')

上面验证title这个字段并不能包括‘hello’字眼,不管大小写。
然后这样使用:

class ProductSerializer(serializers.ModelSerializer):
    owner = UserPublicSerializer(source='user', read_only=True)
    
    title = serializers.CharField(validators=[validators.validate_title_no_hello, validators.unique_product_title])
    body = serializers.CharField(source='content')
    class Meta:
        model = Product
        fields = [
            'owner',
            'pk',
            'title',
            'body',
            'price',
            'sale_price',
            'public',
            'path',
            'endpoint',
        ]
    def get_my_user_data(self, obj):
        return {
            "username": obj.user.username
        }
    
    def get_edit_url(self, obj):
        request = self.context.get('request') # self.request
        if request is None:
            return None
        return reverse("product-edit", kwargs={"pk": obj.pk}, request=request)

想到了继续再更。

标签:title,request,value,django,framework,rest,import
From: https://www.cnblogs.com/ukzq/p/17066267.html

相关文章

  • Python3配合Django来调用钉钉在线api实时监测员工考勤打卡情况
    基本上钉钉(dingding)作为一个远程办公平台来用的话,虽然差强人意,但是奈何市面上没有啥更好的选择,矬子里拔将军,也还是可以凑合用的,不过远程办公有个问题,就是每天需要检查员......
  • Django rest framework
    今天慢慢睁开眼睛,做了好吃的,看到下雪了,不过也没有小时候那种看到雪就要去打雪仗堆雪人的兴致,便打开教程刷了起来。昨天100多米买了Django的极客时间课程,说实话讲得还......
  • Django书籍学习记录
    没有记录回顾的学习都是白学,那天偶尔搜到这本书,其中除了一部分官网的中文翻译,还有一些没有了解到的地方,比如模型查询filter的链式调用,Q.F方法在定义化SQL中起到的作......
  • django rest_framework 视图api开发
     importjsonfromdjango.httpimportJsonResponsefromdjango.views.decorators.csrfimportcsrf_exemptfromdjango.viewsimportViewfromdjango.utils.decorator......
  • 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键
    目录序列化类常用字段类和字段参数常用字段类常用字段参数选项参数通用参数序列化类高级用法之sourcesource填写类中字段source填写模型类中方法source支持跨表查询定制序......
  • Django接入drf_yasg2 API接口文档-完整操作(包含错误处理)
    drf_yasg2的简介:drf-yasg是DjangoRestFramework的一个扩展,使⽤drf_yasg2下载⾃动⽣成的api⽂档的json或yaml⽂件配置项。drf_yasg2的安装:pipinstalldrf-yasg......
  • django-rest-swagger
    在日常工作中,程序员最苦恼的事情大概就是写文档了吧,虽然文档能够利于程序的传承,但是由于业务口径频繁变更,导致维护文档也变成了一件费时又费力的事情。因此,如果能够自动生......
  • Django[三]配置文件settings.py
    一.配置文件详细说明参考:http://c.biancheng.net/view/7475.html二、根据自己的需要修改配置文件1.修改DATABASES连接mysqlDATABASES={'default':{'E......
  • django FilteredRelation 的用法
    有两大用处FilteredRelation类允许为查询集增加一个ON从句可以在多个join中语句直接引用变量fromdjango.db.modelsimportFilteredRelation,Qresult_1=Restaur......
  • django的 prefetch_related 只能 all() 可以用 filter ?
    直接说答案<=Django1.6只能在使用代码过滤somethings=Foo.objects.filter(author="author").prefetch_related("bar_set")forainsomethings:somebars=[p......