这是一个纯Python特定的设计问题:
class MyClass(object):
...
def get_my_attr(self):
...
def set_my_attr(self, value):
...
Run Code Online (Sandbox Code Playgroud)
和
class MyClass(object):
...
@property
def my_attr(self):
...
@my_attr.setter
def my_attr(self, value):
...
Run Code Online (Sandbox Code Playgroud)
Python让我们可以这样做.如果你要设计一个Python程序,你会使用哪种方法?为什么?
我创建了一个ModelSerializer并且想要添加一个不属于我的模型的自定义字段.
我在这里找到了添加额外字段的说明,并尝试了以下内容:
customField = CharField(source='my_field')
Run Code Online (Sandbox Code Playgroud)
当我添加此字段并调用我的validate()函数时,此字段不是attrdict的一部分.attr包含除额外字段外指定的所有模型字段.所以我在覆盖验证中无法访问此字段,是吗?
当我将此字段添加到字段列表时,如下所示:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
Run Code Online (Sandbox Code Playgroud)
然后我得到一个错误,因为customField它不是我的模型的一部分 - 什么是正确的,因为我想只为这个序列化器添加它.
有没有办法添加自定义字段?
如何在DRF 3中的ModelSerializer上添加非模型字段?即添加我的实际模型中不存在的字段?
class TestSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='vote_detail')
non_field = serializers.CharField() # no corresponding model property.
class Meta:
model = vote_model
fields = ("url", "non_field")
def create(self, validated_data):
print(direction=validated_data['non_field'])
Run Code Online (Sandbox Code Playgroud)
但是DRF 3给了我错误:
Got AttributeError when attempting to get a value for field `non_field` on serializer `TestSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Test` instance.
Original exception text was: 'Test' object has no attribute 'non_field'.
Run Code Online (Sandbox Code Playgroud)
我已经使用非模型write_only字段搜索了堆栈DRF - ModelSerializer,并找到了一些解决方案,但这些解决方案是指我正在使用DRF 3的DRF …
我正在阅读Django REST Framework,我有一个使用SerializerMethodField()与getter序列化的模型.
但是,当我POST到此端点时,我希望能够设置此字段,但这不起作用,因为正如上面的文档所示,您无法写入SerializerMethodField.Django REST中是否有任何方法可以为您定义自定义getter方法的序列化器字段,以及自定义setter方法?
编辑:这是我正在尝试做的事情的来源.客户与用户具有一对一的关系.
class ClientSerializer(serializers.ModelSerializer):
email = serializers.SerializerMethodField()
def create(self, validated_data):
email = validated_data.get("email", None) # This doesn't work because email isn't passed into validated_data because it's a readonly field
# create the client and associated user here
def get_email(self, obj):
return obj.user.email
class Meta:
model = Client
fields = (
"id",
"email",
)
Run Code Online (Sandbox Code Playgroud) 刚进入Django Rest Framework.
我有一个简单的示例运行,其中通过REST API呈现模型.模型中没有相关字段,只是一堆字符串.
get_absolute_url()将该模型的值呈现给JSON输出的最简单方法是什么?
我正在serializers.HyperlinkedModelSerializer准备进入具有相关领域的更复杂的模型.