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
для полей модели.