Дополнительное поле select не возвращается из метода create() сериализатора django-rest
Django==3.1.5 djangorestframework==3.12.2
Я хочу сортировать методом order_by() динамически вычисляемое поле. Это поле - "is_active". Я добавил это поле в класс ActivityModelManager, как показано ниже. Поле "is_active" не появляется в данных, возвращаемых из метода create сериализатора. Но в данных, возвращаемых методом обновления сериализатора, появляется.
managers.py
class ActivityModelManager(models.Manager):
def get_queryset(self):
qs = super().get_queryset()
today = datetime.datetime.today().date()
qs = qs.extra(select={'is_active': 'start_date <= %s AND %s < finish_date'}, select_params=(today, today))
return qs
model.py
class ActivityModel(TimestampAbstractModel):
name = models.CharField(max_length=255)
start_date = models.DateField()
finish_date = models.DateField()
vacancy = models.PositiveIntegerField(validators=[MinValueValidator(limit_value=1)])
objects = ActivityModelManager()
def __str__(self):
return self.name
serializers.py
class ActivitySerializer(serializers.ModelSerializer):
is_active = serializers.BooleanField(read_only=True)
class Meta:
model = ActivityModel
fields = [
'id', 'name', 'start_date', 'finish_date', 'vacancy', 'is_active'
]
read_only_fields = [
'id', 'is_active'
]
import datetime
from dateutil.relativedelta import relativedelta
from my_app.models import ActivityModel
from my_app_serializers import ActivitySerializer
#############
#creating
#############
start_date = datetime.datetime.today.date()
finish_date = start_date + relativedelta(months=1)
data = {
"name" : "Activity name",
"start_date" : start_date,
"finish_date" : finish_date,
"vacancy" : 60
}
serializer = ActivitySerializer(data=data)
serializer.is_valid()
ret_val = serializer.save()
#####################################################
#ret_val variable has not contain "is_active" field.
#####################################################
###########
#updating
##########
instance = ActivityModel.objects.create(
name = "Activity Name"
start_date = start_date,
finish_date = finish_date,
vacancy = 60
)
data = {
"name" : "Activity name",
"start_date" : start_date,
"finish_date" : finish_date,
"vacancy" : 60
}
serializer = ActivitySerializer(data=data, instance=instance)
serializer.is_valid()
ret_val = serializer.save()
#################################################
#ret_val variable has contain "is_active" field.
#################################################