Django Rest Framework Boolean / None Value в запросе настроен на ложь
-
21-12-2019 - |
Вопрос
У меня есть значение, названное «Active», которое по умолчанию «True» в модели Django.Я хотел бы не установить это значение и позволить ему быть созданным действием по умолчанию, однако, где-то в рамках отдыха Django установлено значение «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
.
Спасибо
Решение
Хорошо, поэтому я только что попробовал, и действительно модель по умолчанию игнорируется, даже если вы указываете его в сериализатор.Похоже, когда значение не посылается явно, он игнорируется.
Я оглянулся и нашел отчет об ошибке для этого:
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)
.