我有一个名为'active'的值,在Django模型中默认为'True'。我想不设置这个值并允许它由默认操作创建,但是,在Django REST Framework中的某个地方,它在设置为Serializer中的validate方法之前被设置为'False'。如何阻止此操作或至少捕获它,以便我可以将不存在的“活动”值设置为“True”?
我只发布相关代码,这是一个复杂的系统,完整的代码将是压倒性的。状态列来自此抽象类模型。如您所见,只有活动列默认为True。
class StatusModelMixin(models.Model):
active = models.BooleanField(
verbose_name=_("Active"), default=True,
help_text=_("If checked the record is active."))
soft_delete = models.BooleanField(
verbose_name=_("Hide"), default=False,
help_text=_("If checked the record is removed from all queries."))
purge = models.BooleanField(
verbose_name=_("Purge"), default=False,
help_text=_("If checked the record will be deleted."))
class Meta:
abstract = True
def save(self, *args, **kwargs):
"""
Intercept the save and update the 'purge' and 'soft_delete' objects.
This save will not be called during bulk creates and updates, so the
logic below will need to be duplicated for each object in bulk
operations.
"""
if self.purge: self.soft_delete = True
if self.soft_delete: self.active = False
super(StatusModelMixin, self).save(*args, **kwargs)
这只是受我所遇到的问题影响的序列化程序类之一。您可以看到我的一些测试代码无法解决问题。
class OrganizationSerializer(serializers.ModelSerializer):
user = serializers.HyperlinkedRelatedField(
view_name='user-detail', read_only=True)
uri = serializers.HyperlinkedIdentityField(
view_name='organization-detail')
#active = serializers.BooleanField(default=True, required=True)
class Meta:
model = Organization
fields = ('id', 'address_01', 'address_02', 'city', 'region',
'postal_code', 'country', 'phone', 'fax', 'active',
'soft_delete', 'purge', 'ctime', 'mtime', 'institution',
'user', 'uri')
exclude = ('purge',)
read_only_fields = ('id', 'ctime', 'mtime',)
depth = 0
#def validate(self, attrs):
# log.debug("attrs: %s", attrs)
# return attrs
由于
答案 0 :(得分:2)
好的,所以我刚刚尝试过,即使你在序列化程序中指定模型默认值也会被忽略。似乎未明确发送值时会被忽略。
我环顾四周,发现了一个错误报告:
https://github.com/tomchristie/django-rest-framework/issues/1101。
在修复此问题之前,您可以在视图集中尝试这个丑陋的黑客攻击:
def get_serializer(self, *args, **kwargs):
# data may be None
data = kwargs['data']
if data is not None:
data = data.copy() # need to make copy because of immutable QueryDict
data.setdefault('active', True)
kwargs['data'] = data
return super(OrganizationViewSet, self).get_serializer(*args, **kwargs)