Django REST Frameworkリクエスト内のブール/なし値がfalseに設定されています
-
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)
. 所属していません StackOverflow