Django REST Framework: поля по умолчанию в форме API для просмотра

У меня есть модель:

class XCall(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)
    send_on = models.DateTimeField(default=datetime.now)
    recipient = models.ForeignKey(User)
    text = models.CharField(max_length=4096)
    backup_calls = models.IntegerField(blank=True, null=True)

И сериализатор для этой модели:

class CallSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='call-detail',
    )
    # some validation and custom field definitions
    ...

    class Meta:
        model = XCall
        fields = ('url', 'id', 'text', 'recipient', 'send_on', 'backup_calls', 'status')
        lookup_field= 'pk'

И вот список:

class CallList(generics.ListCreateAPIView):
    serializer_class = CallSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrSuperuser,)

    def pre_save(self, obj):
        auth_user = self.request.user
        obj.auth_user = auth_user

    def get_queryset(self):
        """
        This view should return a list of all the calls
        for the currently authenticated user.
        """
        auth = self.request.user
        if isinstance(auth, AnonymousUser):
            return []
        elif auth.is_superuser:
            return XCall.objects.all()
        else:
            return XCall.objects.filter(auth_user=auth)

В CallList API для просмотра, я вижу следующее в форме POST внизу: enter image description here

Мой вопрос: почему нет значения по умолчанию для send_on, и есть один для backup_calls? Я предположил, что форма будет следовать спецификации модели XCall и использовать datetime.now() для дефолта первого и оставить backup_calls пустым (так как он является нулевым). Как я могу получить форму для соответствия спецификациям модели?

Ответ 1

Существует различие между значениями модели по умолчанию и начальными значениями в формах. Это особенно характерно для значений по умолчанию, которые фактически являются функциями, потому что они вызывается только при сохранении экземпляра. Например, какой now вы хотите - на этот раз, когда отображается пустая форма, или время, когда пользователь нажимает "POST"? Django применяет значение по умолчанию при сохранении модели, если значение поля отсутствует. Для достижения желаемого вам необходимо вручную установить значение по умолчанию в поле сериализации, например:

class CallSerializer(serializers.HyperlinkedModelSerializer):
    send_on = serializers.DateTimeField(default=datetime.now)
    ...

Ответ 2

Фактически вы хотите установить значение initial, а не значение по умолчанию. См. docs. Ваш код должен быть:

from django.utils import timezone


class CallSerializer(serializers.HyperlinkedModelSerializer):
    send_on = serializers.DateTimeField(initial=timezone.now())
    ...

Значение по умолчанию - это значение, предоставляемое атрибуту, если для поля не задано значение. Различие между аргументами initial и default отражает разницу между аргументом Django initial для полей формы и аргументом Django default для полей модели.