javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

git

.net

ios

ruby-on-rails

sql

c

string

ruby

传递额外的参数到Django Rest Fram中的Serializer类

我想将一些参数从Viewset传递给DRF Serializer类,因此我已经尝试过:

class OneZeroSerializer(rest_serializer.ModelSerializer):

    def __init__(self, *args, **kwargs):
        print args # show values that passed

    location = rest_serializer.SerializerMethodField('get_alternate_name')

    def get_alternate_name(self, obj):
        return ''


    class Meta:
        model = OneZero

        fields = ('id', 'location')

查看

class OneZeroViewSet(viewsets.ModelViewSet):

   serializer_class = OneZeroSerializer(realpart=1)
   #serializer_class = OneZeroSerializer

   queryset = OneZero.objects.all()

基本上,我想将基于查询字符串的一些值从视图传递给Serializer类,然后将这些分配给字段。

这些字段实际上不包含在“模型”中,而是动态创建的字段。

这个问题stackoverflow中的情况相同,但我无法理解答案。

在这种情况下,任何人都可以帮助我或为我提供更好的选择。

trans by 2019-11-10T13:15:21Z

Django REST Framework自定义字段验证

我正在尝试为模型创建自定义验证,以检查其def validate_date(self): if self.start_date < self.end_date: raise serializers.ValidationError("End date must be after start date.") 是否在其end_date之前,并且证明几乎不可能。

我尝试过的东西:

  • 内置Django验证程序:无需检查

  • 像这样写我自己的:

    def validate_date(self):
       if self.start_date < self.end_date:
            raise serializers.ValidationError("End date must be after start date.")
    

我已经将这些代码添加到Serializer类(然后添加到模型)中,但是似乎在任何一个位置都没有调用它。

我还发现了一些可能有用的代码,但是我不知道如何将其集成到我的方法中-似乎可以验证一个模型属性,但是我需要在两个属性之间进行检查。

我的模特:

class MyModel(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    relation_model = models.ForeignKey(RelationModel, related_name="mymodels")
    priority = models.IntegerField(
        validators = [validators.MinValueValidator(0), validators.MaxValueValidator(100)])
    start_date = models.DateField()
end_date = models.DateField()

    @property
    def is_active(self):
        today = datetime.date.today()
        return (today >= self.start_date) and (today <= self.end_date)

    def __unicode__(self):
        ...

    class Meta:
        unique_together = ('relation_model', 'priority', 'start_date', 'end_date')

菲,所有其他验证工作!

我的序列化器:

class MyModelSerializer(serializers.ModelSerializer):

    relation_model = RelationModelSerializer
    is_active = serializers.Field(source='is_active')

    def validate_date(self):
        if self.start_date > self.end_date:
            raise serializers.ValidationError("End date must be after start date.")   

    class Meta:
        model = MyModel
        fields = (
            'id', 'relation_model', 'priority', 'start_date', 'end_date', 'is_active'
        )

我的观点:

class MyModelList(generics.ListCreateAPIView):
    permission_classes = (IsAdminUser,)
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    ordering = ('priority')
trans by 2019-11-09T01:44:33Z

如何在Django REST框架中将过滤器应用于嵌套资源?

在我的应用中,我具有以下模型:

class Zone(models.Model):
    name = models.SlugField()

class ZonePermission(models.Model):
    zone = models.ForeignKey('Zone')
    user = models.ForeignKey(User)
    is_administrator = models.BooleanField()
    is_active = models.BooleanField()

我正在使用Django REST框架创建返回区域详细信息的资源,以及显示该区域的已验证用户权限的嵌套资源。 输出应该是这样的:

{
    "name": "test", 
    "current_user_zone_permission": {
        "is_administrator": true, 
        "is_active": true
    }
} 

我已经创建了如下的序列化器:

class ZonePermissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = ZonePermission
        fields = ('is_administrator', 'is_active')

class ZoneSerializer(serializers.HyperlinkedModelSerializer):
    current_user_zone_permission = ZonePermissionSerializer(source='zonepermission_set')

    class Meta:
        model = Zone
        fields = ('name', 'current_user_zone_permission')

问题在于,当我请求特定区域时,嵌套资源将为所有对该区域具有权限的用户返回ZonePermission记录。 有什么方法可以对嵌套资源在HyperlinkedIdentityField上应用过滤器?

顺便说一句,我不想为此使用HyperlinkedIdentityField(以最小化http请求)。

这是我根据以下答案实现的解决方案。 我在序列化器类中添加了以下代码:

current_user_zone_permission = serializers.SerializerMethodField('get_user_zone_permission')

def get_user_zone_permission(self, obj):
    user = self.context['request'].user
    zone_permission = ZonePermission.objects.get(zone=obj, user=user)
    serializer = ZonePermissionSerializer(zone_permission)
    return serializer.data

非常感谢您的解决方案!

trans by 2019-11-08T21:37:00Z

apache2-Django rest_framework中缺少授权标头,是否应该责怪apache?

我设法扩展了TokenAuthentication,并在使用请求会话存储令牌时使用了一个工作模型,但是,当我尝试按此处所述将Authorization作为标头参数传递时,我注意到我的响应没有META变量HTTP_AUTHORIZATION而返回 。 我还注意到,如果我将“ Authorization2”作为标头参数传递,则它在请求中可见:

{
    '_content_type': '', 
    'accepted_media_type': 'application/json', 
    '_request': <WSGIRequest
        path:/api/test_auth/,
        GET:<QueryDict: {}>,
        POST:<QueryDict: {}>,
        COOKIES:{
            'MOD_AUTH_CAS_S': 'ba90237b5b6a15017f8ca1d5ef0b95c1',
            'csrftoken': 'VswgfoOGHQmbWpCXksGUycj94XlwBwMh',
            'sessionid': 'de1f3a8eee48730dd34f6b4d41caa210'
        },
        META:{
           'DOCUMENT_ROOT': '/etc/apache2/htdocs',
           'GATEWAY_INTERFACE': 'CGI/1.1',
           'HTTPS': '1',
           'HTTP_ACCEPT': '*/*',
           'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
           'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
           'HTTP_AUTHORIZATION2': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4c',
           ...

我的第一个猜测是apache正在删除授权标头,并且我读过一些S / O问题,指出如果apache与基本授权和身份验证不匹配,它将抛出该值,但是我不知道如何 允许Authorization标头“传递”给Django和WSGIRequest。 有谁知道如何解决这个问题?

我也使用mod_auth_cas和mod_proxy,如果那改变了。

trans by 2019-11-08T14:23:55Z

如何使用Django Rest Framework创建多个模型实例?

我想使用Django Rest Framework通过一个API调用来保存和更新多个实例。 例如,假设我有一个“教室”模型,可以有多个“老师”。 如果我想创建多名老师,然后更新他们的所有教室编号,我该怎么做? 我是否必须为每位老师进行API调用?

我知道目前我们无法保存嵌套模型,但是我想知道是否可以在教师级别保存它。谢谢!

trans by 2019-11-08T11:12:38Z

python-Django rest框架序列化多对多字段

如何将多对多字段序列化为列表,然后通过rest框架返回它们? 在下面的示例中,我尝试返回该帖子以及与其关联的标签列表。

models.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)

serializers.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)

views.py

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
trans by 2019-11-08T09:15:27Z

Django Rest Framework:创建对象后禁用字段更新

我试图通过Django Rest Framework API调用使我的用户模型成为RESTful,以便我可以创建用户以及更新其个人资料。

但是,当我与用户一起执行特定的验证过程时,我不希望用户在创建帐户后能够更新用户名。 我尝试使用read_only_fields,但这似乎在POST操作中禁用了该字段,因此在创建用户对象时无法指定用户名。

我该如何实施呢? 目前存在的API的相关代码如下。

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

    def restore_object(self, attrs, instance=None):
        user = super(UserSerializer, self).restore_object(attrs, instance)
        user.set_password(attrs['password'])
        return user


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    serializer_class = UserSerializer
    model = User

    def get_permissions(self):
        if self.request.method == 'DELETE':
            return [IsAdminUser()]
        elif self.request.method == 'POST':
            return [AllowAny()]
        else:
            return [IsStaffOrTargetUser()]

谢谢!

trans by 2019-11-05T00:24:14Z

python-使用Django Rest Fram返回当前用户

我目前正在使用Django开发API。

但是,我想创建一个视图,该视图返回具有以下端点的当前User:/users/current/

为此,我创建了一个列表视图,并过滤了发出请求的用户的查询集。 可以,但是结果是列表,而不是单个对象。 结合分页,与其他端点相比,结果看起来过于复杂且不一致。

我也尝试创建一个详细视图并过滤查询集,但是DRF抱怨我没有提供pk或slug。

你有什么主意吗?

trans by 2019-10-28T13:11:08Z

python 2.7-如何在Django REST框架中注册用户?

我正在使用Django REST框架编写REST API。 该API将成为社交移动应用程序的后端。 在学习了本教程之后,我可以序列化所有模型,并且可以创建新资源并对其进行更新。

我正在使用AuthToken进行身份验证。

我的问题是:

拥有/users资源后,我希望该应用程序用户能够注册。 因此,拥有像/register这样的单独资源还是允许匿名用户将新资源发布到/users更好?

另外,有关权限的一些指导也将非常有用。

trans by 2019-10-28T01:15:58Z

python-Django Rest Framework + Angular.js Web应用程序中的用户身份验证

我正在开发一个Webapp,用户可以登录以查看其在线酒窖。

我已经安装了Django REST模型,以及Angular中的前端设计,但是我很难将各个部分放在一起,而我的主要问题是用户身份验证。

我已经阅读了许多关于此处和各种教程的文章,但似乎找不到逐步实现身份验证的方法:

  • 应该使用哪种身份验证(令牌,会话,其他?)
  • 如何在服务器端管理身份验证(它是视图吗?是UserModel或UserManager中的方法?)
  • 我有一个自定义的用户模型(使用电子邮件作为用户名)。 我可以使用通用的Django登录方法还是需要创建自己的登录方法?
  • 服务器和客户端之间如何管理身份验证过程?

据我了解,Angular在URL上发出POST请求,其中DRF验证用户名和密码是否匹配并返回令牌或其他身份验证证明。

我感觉自己已经接近了,但是我需要更全面的了解如何将各个部分组合在一起。

提前致谢

trans by 2019-10-11T15:52:32Z

python-Django Rest Framework-未提供身份验证凭据

我正在使用Django Rest Framework开发API。 我正在尝试列出或创建“ Order”对象,但是当我尝试访问控制台时,出现此错误:

{"detail": "Authentication credentials were not provided."}

观看次数:

from django.shortcuts import render
from rest_framework import viewsets
from django.contrib.auth.models import User
from rest_framework.renderers import JSONRenderer, YAMLRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from order.models import *
from API.serializers import *
from rest_framework.permissions import IsAuthenticated

class OrderViewSet(viewsets.ModelViewSet):
    model = Order
    serializer_class = OrderSerializer
    permission_classes = (IsAuthenticated,)

序列化器:

class OrderSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Order
        fields = ('field1', 'field2')

我的网址:

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.contrib import admin
from django.utils.functional import curry
from django.views.defaults import *
from rest_framework import routers
from API.views import *

admin.autodiscover()

handler500 = "web.views.server_error"
handler404 = "web.views.page_not_found_error"

router = routers.DefaultRouter()
router.register(r'orders', OrdersViewSet)

urlpatterns = patterns('',
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
    url(r'^api/', include(router.urls)),
)

然后我在控制台中使用以下命令:

curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55'

错误说:

{"detail": "Authentication credentials were not provided."}
trans by 2019-10-05T17:51:02Z

如何在Django REST Fram中更改字段名称

我试图像SQL中的别名一样更改DRF序列化器中的“模型”字段名称。 我尝试了不同的方法,但无法成功。

models.py

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

serializers.py

class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


    class Meta:
        model = Park
        fields = ('id', 'name', 'location')

我也曾尝试在Django Queryset中添加别名,但无法更改。

更新

这是我面临的例外

/ ViewName /'模块'对象上的AttributeError没有属性'Field'

我怎样才能做到这一点?

trans by 2019-09-27T05:40:06Z

亚马逊网络服务-剥夺的授权凭证--- django,elastic beanstalk,oauth

我在django中使用django-rest-framework实现了REST api,并使用oauth2进行身份验证。

我测试了:

curl -X POST -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=YOUR_USERNAME&password=YOUR_PASSWORD" http://localhost:8000/oauth2/access_token/

curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/

在本地主机上,成功结果与文档一致。

将其推送到现有的AWS Elastic beantalk实例时,我收到了:

{ "detail" : "Authentication credentials were not provided." }
trans by 2019-09-27T00:49:32Z

Django Rest Framework删除cs

我知道有关于Django Rest Framework的答案,但我无法找到解决问题的方法。

我有一个具有身份验证和一些功能的应用程序。我添加了一个新的应用程序,它使用Django Rest Framework。 我想只在这个应用程序中使用该库。 我也想发出POST请求,我总是收到这个回复:

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

我有以下代码:

# urls.py
from django.conf.urls import patterns, url


urlpatterns = patterns(
    'api.views',
    url(r'^object/$', views.Object.as_view()),
)

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt


class Object(APIView):

    @csrf_exempt
    def post(self, request, format=None):
        return Response({'received data': request.data})

我想添加API而不影响当前的应用程序。所以我的问题是如何才能为此应用禁用CSRF?

trans by 2019-09-16T10:19:28Z

python - 在Django Rest Fram的响应中包含中介(通过模型)

我有一个关于处理m2m /通过模型及其在django rest框架中的表示的问题。 我们来看一个经典的例子:

models.py:

from django.db import models

class Member(models.Model):
    name = models.CharField(max_length = 20)
    groups = models.ManyToManyField('Group', through = 'Membership')

class Group(models.Model):
    name = models.CharField(max_length = 20)

class Membership(models.Model):
    member = models.ForeignKey('Member')
    group = models.ForeignKey('Group')
    join_date = models.DateTimeField()

serializers.py:

imports...

class MemberSerializer(ModelSerializer):
    class Meta:
        model = Member

class GroupSerializer(ModelSerializer):
    class Meta:
        model = Group

views.py:

imports...

class MemberViewSet(ModelViewSet):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

class GroupViewSet(ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

在获取成员实例时,我成功接收了所有成员的字段及其组 - 但是我只获得了组的详细信息,而没有来自成员模型的额外详细信息。

换句话说,我希望收到:

{
   'id' : 2,
   'name' : 'some member',
   'groups' : [
      {
         'id' : 55,
         'name' : 'group 1'
         'join_date' : 34151564
      },
      {
         'id' : 56,
         'name' : 'group 2'
         'join_date' : 11200299
      }
   ]
}

注意join_date。

我已经尝试了很多解决方案,当然包括关于它的Django Rest-Framework官方页面,似乎没有人给出一个合适的简单答案 - 我需要做些什么才能包含这些额外的字段? 我发现django-tastypie更直接,但有一些其他问题,更喜欢休息框架。

trans by 2019-09-09T12:54:36Z

python - 禁用ViewSet中的方法django-rest-fram

OPTIONS具有列出,检索,创建,更新,删除等的自动方法

我想禁用其中的一些,我想出的解决方案可能不是一个好的,因为OPTIONS仍然表示允许的那些。

关于如何以正确的方式做到这一点的任何想法?

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer

    def list(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
    def create(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
trans by 2019-09-03T02:59:20Z

django - RESTful API的令牌认证:令牌是否应定期更改?

我正在使用Django和django-rest-framework构建RESTful API。

作为认证机制,我们选择了#Tok;认证&#34; 我已经按照Django-REST-Framework的文档实现了它,问题是,如果应用程序定期更新/更改令牌,如果是,如何? 应该是需要续订令牌的移动应用程序还是Web应用程序应该自动执行此操作?

什么是最佳做法?

这里的任何人都有使用Django REST Framework的经验,可以提出技术解决方案吗?

(最后一个问题的优先级较低)

trans by 2019-08-12T02:26:19Z

python - TemplateDoesNotExist - Django E.

我正在使用Django Rest Framework。 而且我一直收到错误

Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html

我不知道我怎么会出错。 这是我第一次尝试使用REST Framework。这是代码。

views.py

import socket, json
from modules.data.models import *
from modules.utils import *
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from modules.actions.serializers import ActionSerializer


@api_view(['POST'])
@check_field_exists_wrapper("installation")
def api_actions(request, format = None):

    action_type = request.POST['action_type']
    if action_type == "Shutdown" : 
        send_message = '1'
        print "Shutting Down the system..."
    elif action_type == "Enable" : 
        send_message = '1'
        print "Enabling the system..."
    elif action_type == "Disable" : 
        send_message = '1'
        print "Disabling the system..."
    elif action_type == "Restart" : 
        send_message = '1'
        print "Restarting the system..."

    if action_type in ["Shutdown", "Enable", "Disable"] : PORT = 6000
    else : PORT = 6100

    controllers_list = Controller.objects.filter(installation_id = kwargs['installation_id'])

    for controller_obj in controllers_list:
        ip = controller_obj.ip
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, PORT))
            s.send(send_message)
            s.close()
        except Exception as e:
            print("Exception when sending " + action_type +" command: "+str(e))

    return Response(status = status.HTTP_200_OK)

models.py

class Controller(models.Model):
    id = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 255, unique = True)
    ip = models.CharField(max_length = 255, unique = True)
    installation_id = models.ForeignKey('Installation')

serializers.py

来自django.forms导入小部件来自rest_framework导入序列化程序来自modules.data.models import *

class ActionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Controller
        fields = ('id', 'name', 'ip', 'installation_id')

urls.py

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = patterns('modules.actions.views',
    url(r'^$','api_actions',name='api_actions'),
)
trans by 2019-07-12T20:58:24Z

Django REST框架:向ModelSerializ添加其他字段

我想序列化一个模型,但是想要包含一个额外的字段,该字段需要对要序列化的模型实例进行一些数据库查找:

class FooSerializer(serializers.ModelSerializer):
  my_field = ... # result of some database queries on the input Foo object
  class Meta:
        model = Foo
        fields = ('id', 'name', 'myfield')

这样做的正确方法是什么? 我看到你可以传递额外的&#34; context&#34; 到序列化器,是传递上下文字典中的附加字段的正确答案吗? 使用这种方法,获得我需要的字段的逻辑不会是串行器定义自包含的,这是理想的,因为每个序列化实例都需要my_field。在DRF序列化器文档的其他地方,它说&#34;额外的字段可以对应 任何财产或可在模型上赎回&#34;。 我正在谈论的是额外的领域吗? 我应该在Foo的模型定义中定义一个返回my_field值的函数,并且在序列化程序中我将my_field挂钩到该可调用对象? 那是什么样的?

在此先感谢,如有必要,请尽快澄清问题。

trans by 2019-07-06T04:58:43Z

python - django-rest-framework 3.0在嵌套的serializ中创建或更新

使用django-rest-framework 3.0并拥有以下简单模型:

class Book(models.Model):
    title = models.CharField(max_length=50)


class Page(models.Model):
    book = models.ForeignKey(Books, related_name='related_book')
    text = models.CharField(max_length=500)

并且给出了这个JSON请求:

{
   "book_id":1,
   "pages":[
      {
         "page_id":2,
         "text":"loremipsum"
      },
      {
         "page_id":4,
         "text":"loremipsum"
      }
   ]
}

如何编写嵌套序列化程序来处理此JSON,并为给定的create创建新页面或更新(如果存在)。

class RequestSerializer(serializers.Serializer):
    book_id = serializers.IntegerField()
    page = PageSerializer(many=True)


class PageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Page

我知道用instance实例化序列化器会更新当前的序列化器,但我应该如何在嵌套序列化器的create方法中使用它?

trans by 2019-06-22T19:30:44Z

1 2 下一页 共2页