如果我有一个嵌套的序列化程序:
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(Django-rest-framework)中测试我的API.
我正在为我的观点设置测试,这是我的API端点.现在查看文档,我可以使用APIRequestFactory或APIClient.两者似乎也做同样的事情.
这两者有什么区别,为什么/何时应该使用其中一种?
当我在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'并动态分配模型?
我正在创建一个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只需将它们放入我的模型声明中,一切都处理完毕)
在 Flask 中,我设置了 SQLAlchemy 以使用根据请求选择的多个数据库,如https://quanttype.net/posts/2016-03-15-flask-sqlalchemy-and-multitenancy.html中所述
因此,SQLAlchemy 配置了 SQLALCHEMY_BINDS,以将传入请求重定向到正确的数据库。
我正在尝试让 Alembic 使用多个数据库。例如。models.py 中的模型在所有数据库中应该相同。
据我所知,alembic multidb仅适用于模型中的bind_key来指定应在哪个数据库中创建哪个表,但我想一次性创建所有数据库中的所有表。我怎么做?
我想构建一个具有字段级权限的 API。我从数据库表中获得了这些权限,但是在 REST 框架中检查用户是否可以对对象的字段执行 CRUD 操作的地方是什么?
database --- model ---- ModelSerializer ---- ModelViewSet --- browser
Run Code Online (Sandbox Code Playgroud)
在 ModelSerializer 中?在这里,我可以在字段到达视图集之前删除字段,但默认情况下我无权访问 request.user,因此我必须实现它,这可以完成,但不能与我拥有的其他第 3 方库一起使用(django-rest-swagger)
还是在 ModelViewset 中?我可以覆盖列表、创建、更新和销毁方法以删除用户无权访问的字段。但这不适用于我的 Metadata 实现,因为它直接从序列化程序获取元数据。
或者两者都有?例如:DROP不被允许读取在串行当模型的获取通过串行,并在视图集落不被允许的写,之前他们得到传递回至串行?
当我定义 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,名称混淆了)
我似乎无法理解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) 我编写了一些解析配置文件的代码.如果配置文件包含它在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()?
你好,我的 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__ 时,必须实例化它们似乎是错误的
我可能在这里遗漏了一些东西,但是有人可以向我解释一下为什么我的思维方式可能有点缺陷吗?
django ×6
python ×5
python-3.x ×4
rest ×3
unit-testing ×2
alembic ×1
mocking ×1
rust ×1
sqlalchemy ×1
validation ×1