假设我有以下模型,和模型序列化器:
模型。派克
class Approve(models.Model):
process = models.IntegerField(verbose_name='Associated Process')
content = models.CharField(max_length=300, verbose_name="Approval Content")
serializers.py
class ApproveSerializer(serializers.ModelSerializer):
class Meta:
model = Approve
fields = ('id', 'process' ,'content')
def validate(self, value):
process = value['process']
try:
something_else = Something.objects.get(process)
except Something.DoesNotExist:
raise serializers.ValidationError('Invalid Process')
return value
问题是我想在views.py中使用这个对象something_else,而不是进行另一个数据库查询。有什么方法可以通过串行化程序传递它,而不会在调用serializer.is_valid()方法时导致串行化程序验证错误。
我想出了解决这个问题的方法。
serializers.py
class ApproveSerializer(serializers.ModelSerializer):
class Meta:
model = Approve
fields = ('id', 'process' ,'content')
def validate(self, value):
process = value['process']
try:
something_else = Something.objects.get(process)
value['something_else'] = something_else
except Something.DoesNotExist:
raise serializers.ValidationError('Invalid Process')
return value
意见。在调用序列化程序之前。方法,则应弹出已添加到序列化程序的值。
def post(self, request):
serializer = ApproveSerializer(data=request.data)
if serializer.is_valid():
something_else = serializer.validated_data.pop('something_else')
something_else.property = new_property
something_else.save()
serializer.save()
else:
# Error handling goes here serialzier.errors
我不确定这是一个好的做法,但至少现在对我来说是有效的。希望知道更好的解决办法。
我不确定你的views.py
看起来怎么样,但本质上,你需要在那里实例化序列化器:
def approve_view(request):
if request.method == "POST":
process = request.POST.get('value', None)
something_else = Something.objects.filter(process=process).first()
serializer = ApproveSerializer(something_else=something_else) # This is where you pass the something_else object.
if serializer.is_valid():
# Your code for successful validation.
else:
# Your code for failed validation
现在,您已经将something_else
传递到ProveSerializer
,您需要将其设置为属性:
class ApproveSerializer(serializers.ModelSerializer):
def __init__(self, something_else=None):
self.something_else = something_else
class Meta:
model = Approve
fields = ('id', 'process' ,'content')
def validate(self, value):
process = value['process']
if not self.something_else:
raise serializers.ValidationError('Invalid Process')
return value
我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误
def validate_mobile_number(value):如果不是str(value).isdigit():引发ValidationError(“请输入有效的手机号码”)类ModelA(AbstractUser): mobile=models.CharField(u(“mobile”),unique=True,max_length=10,验证器[validate_mobile_numbe
问题内容: 情况 在Django REST Framework的验证中工作时,我注意到字段总是被验证,即使这样做不一定有意义。以以下示例进行模型的序列化: 我有一个创建用户的端点。因此,有一个领域和一个领域。如果两个字段不匹配,则无法创建用户。同样,如果所请求的已经存在,则无法创建用户。 用户为上述每个字段发布了不正确的值 已在序列化程序中实现的实现(请参见下文),以捕获不匹配和字段 实施: 问题
问题内容: 我有一个带有开始和结束日期范围的Django模型。我想强制执行验证,以便没有两个记录具有重叠的日期范围。最简单的实现方式是什么,这样我就不必重复编写逻辑了? 例如,我不想在Form 和 a 以及 admin表单中重新实现此逻辑, 并且 模型被重写。 据我所知,Django在全球范围内强制执行这些类型的条件并不容易。 Googling并不是很有帮助,因为“模型验证”通常是指验证特定的模型
问题内容: 我使用的是Django Rest Framework,其中有以下两个序列化器: ServiceType模型如下所示: 我想通过更改相关服务(例如删除其中的一些服务)来更新现有实例。为此,我正在这样做: 我面临的问题是没有提供该字段-这意味着我得到了-尽管我在 字段中明确添加了该字段。 编辑 这是我发布的一个示例性请求(来自Chrome): 我在做什么错以及如何使用嵌套序列化程序获取对象
问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。