</h1>
<div class="clear"></div>
<div class="postBody">
快速实例
序列化
创建一个序列化类
简单使用
开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json
之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。
models部分:
from django.db import models# Create your models here.
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def str(self):
return self.titleclass Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def str(self):
return self.nameclass Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def str(self):
return self.name
views部分:
from rest_framework.views import APIView from rest_framework.response import Response from .models import * from django.shortcuts import HttpResponse from django.core import serializersfrom rest_framework import serializers
class BookSerializers(serializers.Serializer):
title=serializers.CharField(max_length=32)
price=serializers.IntegerField()
pub_date=serializers.DateField()
publish=serializers.CharField(source="publish.name")
#authors=serializers.CharField(source="authors.all")
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
temp=[]
for author in obj.authors.all():
temp.append(author.name)
return tempclass BookViewSet(APIView):
</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs): book_list</span>=<span style="color: #000000;">Book.objects.all() </span><span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式1:</span> <span style="color: #008000;">#</span><span style="color: #008000;"> from django.forms.models import model_to_dict</span> <span style="color: #008000;">#</span><span style="color: #008000;"> import json</span> <span style="color: #008000;">#</span><span style="color: #008000;"> data=[]</span> <span style="color: #008000;">#</span><span style="color: #008000;"> for obj in book_list:</span> <span style="color: #008000;">#</span><span style="color: #008000;"> data.append(model_to_dict(obj))</span> <span style="color: #008000;">#</span><span style="color: #008000;"> print(data)</span> <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse("ok")</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式2:</span> <span style="color: #008000;">#</span><span style="color: #008000;"> data=serializers.serialize("json",book_list)</span> <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse(data)</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式3:</span> bs=BookSerializers(book_list,many=<span style="color: #000000;">True) </span><span style="color: #0000ff;">return</span> Response(bs.data)</pre>
ModelSerializer
class BookSerializers(serializers.ModelSerializer): class Meta: model=Book fields="__all__" depth=1
提交post请求
def post(self,request,*args,**kwargs):bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
重写save中的create方法
class BookSerializers(serializers.ModelSerializer):</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta: model</span>=<span style="color: #000000;">Book fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span> <span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ['authors',]</span> <span style="color: #008000;">#</span><span style="color: #008000;"> depth=1</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> create(self, validated_data): authors </span>= validated_data.pop(<span style="color: #800000;">'</span><span style="color: #800000;">authors</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= Book.objects.create(**<span style="color: #000000;">validated_data) obj.authors.add(</span>*<span style="color: #000000;">authors) </span><span style="color: #0000ff;">return</span> obj</pre>
单条数据的get和put请求
class BookDetailViewSet(APIView):</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk): book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=<span style="color: #000000;">BookSerializers(book_obj) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk): book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=BookSerializers(book_obj,data=<span style="color: #000000;">request.data) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): bs.save() </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
超链接API:Hyperlinked
class BookSerializers(serializers.ModelSerializer): publish= serializers.HyperlinkedIdentityField(
view_name='publish_detail',
lookup_field="publish_id",
lookup_url_kwarg="pk") class Meta: model=Book fields="__all__" #depth=1
urls部分:
1 2 3 4 5 6 | urlpatterns = [ url(r '^books/$' , views.BookViewSet.as_view(),name = "book_list" ), url(r '^books/(?P<pk>d+)$' , views.BookDetailViewSet.as_view(),name = "book_detail" ), url(r '^publishers/$' , views.PublishViewSet.as_view(),name = "publish_list" ), url(r '^publishers/(?P<pk>d+)$' , views.PublishDetailViewSet.as_view(),name = "publish_detail" ), ] |
视图三部曲
使用混合(mixins)
上一节的视图部分:
from rest_framework.views import APIView from rest_framework.response import Response from .models import * from django.shortcuts import HttpResponse from django.core import serializersfrom rest_framework import serializers
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="all"
#depth=1class PublshSerializers(serializers.ModelSerializer):
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta: model</span>=<span style="color: #000000;">Publish fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span><span style="color: #000000;"> depth</span>=1
class BookViewSet(APIView):
</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs): book_list</span>=<span style="color: #000000;">Book.objects.all() bs</span>=BookSerializers(book_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(request.data) bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(bs.validated_data) bs.save() </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)
class BookDetailViewSet(APIView):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk): book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=BookSerializers(book_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk): book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=BookSerializers(book_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): bs.save() </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)
class PublishViewSet(APIView):
</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs): publish_list</span>=<span style="color: #000000;">Publish.objects.all() bs</span>=PublshSerializers(publish_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs): bs</span>=PublshSerializers(data=request.data,many=<span style="color: #000000;">False) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)class PublishDetailViewSet(APIView):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk): publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=PublshSerializers(publish_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk): publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first() bs</span>=PublshSerializers(publish_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request}) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid(): bs.save() </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
mixin类编写视图
from rest_framework import mixins from rest_framework import genericsclass BookViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):queryset </span>=<span style="color: #000000;"> Book.objects.all() serializer_class </span>=<span style="color: #000000;"> BookSerializers </span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> self.list(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span> post(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> self.create(request, *args, **<span style="color: #000000;">kwargs)
class BookDetailViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers</span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> self.retrieve(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span> put(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> self.update(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span> delete(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> self.destroy(request, *args, **kwargs)</pre>
使用通用的基于类的视图
通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py
模块。
from rest_framework import mixins from rest_framework import genericsclass BookViewSet(generics.ListCreateAPIView):
queryset </span>=<span style="color: #000000;"> Book.objects.all() serializer_class </span>=<span style="color: #000000;"> BookSerializers
class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializersclass PublishViewSet(generics.ListCreateAPIView):
queryset </span>=<span style="color: #000000;"> Publish.objects.all() serializer_class </span>=<span style="color: #000000;"> PublshSerializers
class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset = Publish.objects.all()
serializer_class = PublshSerializers
viewsets.ModelViewSet
urls.py:
url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"), url(r'^books/(?P<pk>d+)$', views.BookViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }),name="book_detail"),
views.py:
class BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializers
认证与权限组件
认证组件
局部视图认证
在app01.service.auth.py:
class Authentication(BaseAuthentication):</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> authenticate(self,request): token</span>=request._request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">token</span><span style="color: #800000;">"</span><span style="color: #000000;">) token_obj</span>=UserToken.objects.filter(token=<span style="color: #000000;">token).first() </span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> token_obj: </span><span style="color: #0000ff;">raise</span> exceptions.AuthenticationFailed(<span style="color: #800000;">"</span><span style="color: #800000;">验证失败!</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> (token_obj.user,token_obj)</pre>
在views.py:
def get_random_str(user): import hashlib,time ctime=str(time.time())md5</span>=hashlib.md5(bytes(user,encoding=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">)) md5.update(bytes(ctime,encoding</span>=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">)) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> md5.hexdigest()
from app01.service.auth import *
from django.http import JsonResponse
class LoginViewSet(APIView):
authentication_classes = [Authentication,]
def post(self,request,*args,**kwargs):
res={"code":1000,"msg":None}
try:
user=request._request.POST.get("user")
pwd=request._request.POST.get("pwd")
user_obj=UserInfo.objects.filter(user=user,pwd=pwd).first()
print(user,pwd,user_obj)
if not user_obj:
res["code"]=1001
res["msg"]="用户名或者密码错误"
else:
token=get_random_str(user)
UserToken.objects.update_or_create(user=user_obj,defaults={"token":token})
res["token"]=token</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e: res[</span><span style="color: #800000;">"</span><span style="color: #800000;">code</span><span style="color: #800000;">"</span>]=1002<span style="color: #000000;"> res[</span><span style="color: #800000;">"</span><span style="color: #800000;">msg</span><span style="color: #800000;">"</span>]=<span style="color: #000000;">e </span><span style="color: #0000ff;">return</span> JsonResponse(res,json_dumps_params={<span style="color: #800000;">"</span><span style="color: #800000;">ensure_ascii</span><span style="color: #800000;">"</span>:False})</pre>
全局视图认证组件
settings.py配置如下:
1 2 3 | REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES" :[ "app01.service.auth.Authentication" ,] } |
权限组件
局部视图权限
在app01.service.permissions.py中:
from rest_framework.permissions import BasePermission class SVIPPermission(BasePermission): message="SVIP才能访问!" def has_permission(self, request, view): if request.user.user_type==3: return True return False
在views.py:
from app01.service.permissions import *class BookViewSet(generics.ListCreateAPIView):
permission_classes = [SVIPPermission,]
queryset = Book.objects.all()
serializer_class = BookSerializers
全局视图权限
settings.py配置如下:
1 2 3 4 | REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES" :[ "app01.service.auth.Authentication" ,], "DEFAULT_PERMISSION_CLASSES" :[ "app01.service.permissions.SVIPPermission" ,] } |
throttle(访问频率)组件
局部视图throttle
在app01.service.throttles.py中:
from rest_framework.throttling import BaseThrottleVISIT_RECORD={}
class VisitThrottle(BaseThrottle):</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span><span style="color: #000000;">(self): self.history</span>=<span style="color: #000000;">None </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> allow_request(self,request,view): remote_addr </span>= request.META.get(<span style="color: #800000;">'</span><span style="color: #800000;">REMOTE_ADDR</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(remote_addr) </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time ctime</span>=<span style="color: #000000;">time.time() </span><span style="color: #0000ff;">if</span> remote_addr <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> VISIT_RECORD: VISIT_RECORD[remote_addr]</span>=<span style="color: #000000;">[ctime,] </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True history</span>=<span style="color: #000000;">VISIT_RECORD.get(remote_addr) self.history</span>=<span style="color: #000000;">history </span><span style="color: #0000ff;">while</span> history <span style="color: #0000ff;">and</span> history[-1]<ctime-60<span style="color: #000000;">: history.pop() </span><span style="color: #0000ff;">if</span> len(history)<3<span style="color: #000000;">: history.insert(0,ctime) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> False </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> wait(self): </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time ctime</span>=<span style="color: #000000;">time.time() </span><span style="color: #0000ff;">return</span> 60-(ctime-self.history[-1])</pre>
在views.py中:
from app01.service.throttles import *class BookViewSet(generics.ListCreateAPIView):
throttle_classes = [VisitThrottle,]
queryset = Book.objects.all()
serializer_class = BookSerializers
全局视图throttle
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",], "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",], "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",] }
内置throttle类
在app01.service.throttles.py修改为:
class VisitThrottle(SimpleRateThrottle):scope</span>=<span style="color: #800000;">"</span><span style="color: #800000;">visit_rate</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> get_cache_key(self, request, view): </span><span style="color: #0000ff;">return</span> self.get_ident(request)</pre>
settings.py设置:
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",], "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",], "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",], "DEFAULT_THROTTLE_RATES":{ "visit_rate":"5/m", } }
解析器
request类
django的request类和rest-framework的request类的源码解析
局部视图
from rest_framework.parsers import JSONParser,FormParser class PublishViewSet(generics.ListCreateAPIView): parser_classes = [FormParser,JSONParser] queryset = Publish.objects.all() serializer_class = PublshSerializers def post(self, request, *args, **kwargs): print("request.data",request.data) return self.create(request, *args, **kwargs)
全局视图
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",], "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",], "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",], "DEFAULT_THROTTLE_RATES":{ "visit_rate":"5/m", }, "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',] }
分页
简单分页
from rest_framework.pagination import PageNumberPagination,LimitOffsetPaginationclass PNPagination(PageNumberPagination):
page_size = 1
page_query_param = 'page'
page_size_query_param = "size"
max_page_size = 5class BookViewSet(viewsets.ModelViewSet):
queryset </span>=<span style="color: #000000;"> Book.objects.all() serializer_class </span>=<span style="color: #000000;"> BookSerializers </span><span style="color: #0000ff;">def</span> list(self,request,*args,**<span style="color: #000000;">kwargs): book_list</span>=<span style="color: #000000;">Book.objects.all() pp</span>=<span style="color: #000000;">LimitOffsetPagination() pager_books</span>=pp.paginate_queryset(queryset=book_list,request=request,view=<span style="color: #000000;">self) </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(pager_books) bs</span>=BookSerializers(pager_books,many=<span style="color: #000000;">True) </span><span style="color: #008000;">#</span><span style="color: #008000;">return Response(bs.data)</span> <span style="color: #0000ff;">return</span> pp.get_paginated_response(bs.data)</pre>
偏移分页
from rest_framework.pagination import LimitOffsetPagination
MVC分部视图@Html.Partial
DevExpress ASP.NET
DevExpress ASP.NET
@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
MVC中@Html.Action的用法(类似自定义控件)
MVC中@Html.Action的用法(类似自定义控件)
C#.Net下的防抖Debounce和节流阀Throttle功能实现
C#.Net下的防抖Debounce和节流阀Throttle功能实现
- 最新文章
-
sqlserverFOR XML PATH 函数用法
sqlserverFOR XML PATH 函数用法
[转]学习ADO.NET技术(一)
[转]学习ADO.NET技术(一)
10年后编程还有意义吗?
10年后编程还有意义吗?
一张图弄明白开源协议GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别
一张图弄明白开源协议GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别
C# datatable 重新排序
C# datatable 重新排序
- 热门文章
-
解决VS10卡慢VisualStudio2010占资源 降低
解决VS10卡慢VisualStudio2010占资源 降低
Visual Studio 中如何显示,及关闭方法的引用
Visual Studio 中如何显示,及关闭方法的引用
Visual Studio 2010 各种各样的错误的预解决方案 devenv /resetskippkgs
Visual Studio 2010 各种各样的错误的预解决方案 devenv /resetskippkgs
C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密
C# 加密(Encrypt) 解密(Decrypt) 操作类 java与 C# 可以相互加密解密
C# IQueryable和IEnumerable的区别
C# IQueryable和IEnumerable的区别