Django Rest Framework Boolean / None Value в запросе настроен на ложь

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

  •  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)
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top