小编Rob*_*wen的帖子

嵌套序列化程序中的上下文django rest框架

如果我有一个嵌套的序列化程序:

class ChildSerializer(ModelSerializer):
    class Meta:
        fields = ('c_name', )
        model = Child


class ParentSerializer(ModelSerializer):

    child = ChildSerializer(many=True, read_only=True)

    class Meta:
        model = Parent
        fields = ('p_name', 'child')
Run Code Online (Sandbox Code Playgroud)

我想访问嵌套序列化器中的上下文,我该怎么做?据我所知,上下文没有传递给孩子.

我希望能够在字段上为每个用户实现一个权限模型,因为我重写了ModelSerializer的get_fields()方法:

def get_fields(self):
    fields = super().get_fields()
    ....
    for f in fields:
        if has_rights(self.context['request'].user, f, "read"):
            ret_val[f] = fields[f]
    ....
    return ret_val
Run Code Online (Sandbox Code Playgroud)

这适用于常规序列化程序,但是当嵌套子项传递给get_fields()时,上下文以及请求和用户不可用.串行器嵌套时如何访问上下文?

django serialization python-3.x django-rest-framework

25
推荐指数
4
解决办法
4612
查看次数

Django测试rest-framework:APIRequestFactory vs APIClient

刚接触测试我想在Django(Django-rest-framework)中测试我的API.

我正在为我的观点设置测试,这是我的API端点.现在查看文档,我可以使用API​​RequestFactory或APIClient.两者似乎也做同样的事情.

这两者有什么区别,为什么/何时应该使用其中一种?

django rest unit-testing django-rest-framework

20
推荐指数
1
解决办法
3766
查看次数

在Meta中使用动态模型创建通用序列化程序

当我在django-rest0-framework中创建一个基于ModelSerializer的Serializer时,我将不得不在Meta类中传递模型:

class ClientSerializer(ModelSerializer):
    class Meta:
        model = Client
Run Code Online (Sandbox Code Playgroud)

我想创建一个通用的序列化程序,它基于URL动态地包含模型.

我的设置因此包括urls.py和viewset:

urls.py:

 url(r'^api/v1/general/(?P<model>\w+)', kernel_api_views.GeneralViewSet.as_view({'get':'list'}))
Run Code Online (Sandbox Code Playgroud)

和views.py:

class GeneralViewSet(viewsets.ModelViewSet):

     def get_queryset(self):
            # Dynamically get the model class from myapp.models
            queryset = getattr(myapp.models, model).objects.all()
            return queryset

     def get_serializer_class(self):
         return getattr(myapp.serializers, self.kwargs['model']+'Serializer')
Run Code Online (Sandbox Code Playgroud)

其中有:http://127.0.0.1:8000 /api/v1/general/Client将Client.objects.all()作为queryset,将ClientSerializer类作为序列化程序

问题:如何制作它以便我可以调用'GeneralSerializer'并动态分配模型?

python django python-3.x django-rest-framework

13
推荐指数
2
解决办法
5942
查看次数

我应该在哪里对对象和字段进行django验证?

我正在创建一个django应用程序,它使用Django Rest Framework和普通的django-views作为用户的入口点.

我想验证我的模型的独立字段和整体上的对象.例如:

  • 字段:输入的牌照是基于正则表达式函数的正确牌照.与其他领域无关.

  • 对象:输入的邮政编码是否对给定国家/地区有效.与模型中的邮政编码和国家/地区相关.

对于DRF-API,我使用ModelSerializers自动调用我放在模型中的所有验证器,例如:

class MyModel(models.Model):
    licence_plate = CharField(max_length=20, validators=[LicencePlateValidator])
Run Code Online (Sandbox Code Playgroud)

由于验证器是在模型中给出的,因此验证了API POSTS(因为我使用了ModelSerializer)以及在django admin后端中创建的对象.

但是,当我想引入对象级验证时,我需要在序列化程序的validate() - 方法中执行此操作,这意味着对象仅在API中进行验证.

我也必须覆盖模型的save方法,以验证在Django管理页面中创建的对象.

问题:这对我来说似乎有点乱,有一点我可以放置对象级验证器,以便它们在API和管理页面中运行,就像我在字段级验证中所做的那样(I只需将它们放入我的模型声明中,一切都处理完毕)

python django validation django-rest-framework

6
推荐指数
1
解决办法
1563
查看次数

alembic + sqlalchemy 多个数据库

在 Flask 中,我设置了 SQLAlchemy 以使用根据请求选择的多个数据库,如https://quanttype.net/posts/2016-03-15-flask-sqlalchemy-and-multitenancy.html中所述

因此,SQLAlchemy 配置了 SQLALCHEMY_BINDS,以将传入请求重定向到正确的数据库。

我正在尝试让 Alembic 使用多个数据库。例如。models.py 中的模型在所有数据库中应该相同。

据我所知,alembic multidb仅适用于模型中的bind_key来指定应在哪个数据库中创建哪个表,但我想一次性创建所有数据库中的所有表。我怎么做?

python sqlalchemy alembic

6
推荐指数
2
解决办法
2716
查看次数

Django Rest Framework 和字段级权限

我想构建一个具有字段级权限的 API。我从数据库表中获得了这些权限,但是在 REST 框架中检查用户是否可以对对象的字段执行 CRUD 操作的地方是什么?

database --- model ---- ModelSerializer ---- ModelViewSet --- browser
Run Code Online (Sandbox Code Playgroud)

在 ModelSerializer 中?在这里,我可以在字段到达视图集之前删除字段,但默认情况下我无权访问 request.user,因此我必须实现它,这可以完成,但不能与我拥有的其他第 3 方库一起使用(django-rest-swagger)

还是在 ModelViewset 中?我可以覆盖列表、创建、更新和销毁方法以删除用户无权访问的字段。但这不适用于我的 Metadata 实现,因为它直接从序列化程序获取元数据。

或者两者都有?例如:DROP不被允许读取串行当模型的获取通过串行,并在视图集落不被允许的写,之前他们得到传递回串行?

django rest django-rest-framework

3
推荐指数
2
解决办法
2098
查看次数

自动将所有模型字段添加到 django Rest 序列化器

当我定义 ModelSerializer 时,元类可用于定义要序列化的字段,它会自动继承模型中的所有字段:

class ClientSerializer(ModelSerializer):
    class Meta:
        model = Client
Run Code Online (Sandbox Code Playgroud)

我必须构建一个嵌套序列化器(基于 SerializerMethodField)。所以我必须定义要包含的字段:

class ClientSerializer(ModelSerializer)
     address = SerializerMethodField('get_client_addresses')

     class Meta:
          model = Client
          fields = ('address','name','city', <etc*>)

     def get_client_addresses(self, obj):
          addresses = Addresses.objects.all().filter(parent=obj)
          serializer = AddressSerializer(addresses, many=True,
                                         context={'request', self.context.get('request') })
          return serializer.data
Run Code Online (Sandbox Code Playgroud)

问题:在这种情况下,我必须手动将所有客户端字段添加到字段元组中。我不想这样做,因为它看起来相当重复且对错误敏感。如何将“plus-1”字段(在本例中为地址)添加到使用 ModelSerialzer 时包含的默认字段???

注意:这是一个简化的示例。我有包含 40 多个字段的模型,并且必须对嵌套模型使用 SerializerMethodField,因为我必须将上下文数据(用户信息)传递给序列化器以进行我已实现的字段级身份验证。

(更新,地址是一个 SerializerMethodField,名称混淆了)

django rest python-3.x django-rest-framework

2
推荐指数
1
解决办法
3330
查看次数

python模拟在类中使用的全局函数

我似乎无法理解Python中的嘲笑.我有一个全局功能:

a.py:

def has_permission(args):
    ret_val = ...get-true-or-false...
    return ret_val
Run Code Online (Sandbox Code Playgroud)

b.py:

class MySerializer(HyperlinkedModelSerializer):

     def get_fields():
         fields = super().get_fields()
         for f in :
             if has_permission(...):
                 ret_val[f.name] = fields[f]
         return ret_val
Run Code Online (Sandbox Code Playgroud)

c.py:

class CountrySerializer(MySerializer):
    class Meta:
        model = Country
Run Code Online (Sandbox Code Playgroud)

问题:现在我想测试c.py,但我想模拟a.py中定义的has_permission函数,但是在b.py中定义的类MySerializer的get_fields方法中调用...如何我这样做?

我尝试过这样的事情:

@patch('b.MySerializer.has_permission')
Run Code Online (Sandbox Code Playgroud)

@patch('b.MySerializer.get_fields.has_permission')
Run Code Online (Sandbox Code Playgroud)

@patch('a.has_permission')
Run Code Online (Sandbox Code Playgroud)

但我尝试的一切只是不起作用和has_permission仍然执行,或python抱怨它无法找到属性'has_permission'

修补完成:

test.py

class TestSerializerFields(TestCase):
    @patch(... the above examples....)
    def test_my_country_serializer():
        s = CountrySerializer()
        self..assertTrue(issubclass(my_serializer_fields.MyCharField, type(s.get_fields()['field1'])))
Run Code Online (Sandbox Code Playgroud)

python unit-testing mocking

2
推荐指数
2
解决办法
4543
查看次数

使用unwrap_or解析整数或提供默认值,但在使用默认值时打印错误消息

我编写了一些解析配置文件的代码.如果配置文件包含它在Configstruct中设置的字段的有效值.如果未找到设置的有效整数值,则设置默认值(例如:90).

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or(90),
}
Run Code Online (Sandbox Code Playgroud)

如何让它关闭,以便它可以打印error!并设置默认值?

看起来如下:

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or({
        error!("No interval found. Using default: 90");
        90
    });
}
Run Code Online (Sandbox Code Playgroud)

但在此示例中,error!即使从配置中读取了间隔中的有效值,也始终执行该操作.

我怎样才能使unwrap_or只在失败optb时执行代码parse()

rust

2
推荐指数
1
解决办法
99
查看次数

python在未实例化的类上调用方法

你好,我的 Python 3.5.2 代码中有一个类:

class Foo(object):
    __description__ = "Description of Foo"

    def get_description(self):
        return self.__description__
Run Code Online (Sandbox Code Playgroud)

现在我可以在 Foo 的实例中调用 get_description :

foo = Foo()
foo.get_description()
Out: "Description of Foo"
Run Code Online (Sandbox Code Playgroud)

如果我没有可用的实例,我可以这样做:

print(Foo.__description__)
Out: "Description of Foo"
Run Code Online (Sandbox Code Playgroud)

但在我的代码中,我真的不想直接访问 __description__ ,因为我进一步抽象了我的代码,以便在其他没有 __description__ 但生成描述的类(Bar、Baz 等)上使用 get_description另一种方式是使用 get_descripton() 方法。

那么这样做是明智的、可行的还是不可取的:

Foo.get_description(Foo)
Out: "Description of Foo"
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但对我来说看起来相当丑陋,有没有更好的方法来做到这一点而不必实例化 Foo. 实际上,我的 Foo 对象是具有数十种方法的一千行代码,当我实际上只需要静态定义的 __description__ 时,必须实例化它们似乎是错误的

我可能在这里遗漏了一些东西,但是有人可以向我解释一下为什么我的思维方式可能有点缺陷吗?

python python-3.x

1
推荐指数
1
解决办法
641
查看次数