Django REST Framework请求中的boolean / None值设置为False

时间:2013-11-17 00:45:17

标签: django django-rest-framework

我有一个名为'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

由于

1 个答案:

答案 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)