我有一个模特:
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表单中看到以下内容:
我的问题是:为什么send_on
没有设置默认值,backup_calls
有一个默认值?我假设表单会遵循XCall
模型规范并使用datetime.now()
来默认前者,并将backup_calls
留空(因为它可以为空)。如何让表格符合模型规格?
答案 0 :(得分:3)
表单中的模型默认值和初始值之间存在区别。对于实际上是函数的默认值尤其如此,因为它们仅在保存实例时被调用。例如,您想要哪个now
- 显示空白表单的时间,或用户按下“POST”的时间?如果字段值丢失,Django在保存模型时应用默认值。要实现您的目标,您需要在序列化字段中手动设置默认值,例如:
class CallSerializer(serializers.HyperlinkedModelSerializer):
send_on = serializers.DateTimeField(default=datetime.now)
...
答案 1 :(得分: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
参数之间的区别。