Django REST Frameworkリクエスト内のブール/なし値がfalseに設定されています

StackOverflow https://stackoverflow.com//questions/20025802

  •  21-12-2019
  •  | 
  •  

質問

私はDjangoモデルの「true」にデフォルトである「Active」という名前の値があります。この値を設定し、デフォルトのアクションによって作成されず、Django RESTフレームワークのどこかに、シリアライザの検証メソッドに取得される前に '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)
.

これは私が持っている問題によって行われるシリアライザクラスの1つです。問題を解決しなかったテストコードのいくつかを見ることができます。

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
.

ありがとう

役に立ちましたか?

解決

大丈夫だから私は試したばかりで、本当にモデルのデフォルトは、シリアライザで指定しても無視されています。値が明示的に送信されないように思われるのは無視されています。

私は周りを見回して、このためのバグ報告を見つけました:

https://github.com/tomchristie/django-rest-framework/問題/ 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)
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top