django - 如何根据前一个字段的选择自动生成字段
问题描述
我在 Django Rest Framework 中有一个模型和一些序列化程序。我想选择“service_interval”字段,然后根据他们选择的内容在数据库中正确生成日期。我该怎么做?
这是我的代码。
class Snippet(VIPSnippet):
title = models.CharField(max_length=100, blank=True, default='')
service_interval_choices = [
(3, '3 Months'),
(6 , '6 Months'),
(9, '9 Months'),
(12, '1 Year'),
]
service_interval = models.IntegerField(choices=service_interval_choices)
next_service = models.DateTimeField()
序列化器
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')
class Meta:
model = Snippet
fields = ['url', 'service_interval']
next_service = datetime.datetime.now() + datetime.timedelta(3*365/12)
当我这样做时,我收到以下错误
NOT NULL constraint failed: snippets_snippet.next_service
我计划用 service_interval 或我需要的任何变量替换 datetime.timedelta(3*365/12) 中的“3”,以便它根据需要生成日期,但可能在未来几个月。
解决方案
您可以通过覆盖序列化程序的validate
-method来做到这一点:
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')
def validate(self, data):
data["next_service"] = datetime.datetime.now() + datetime.timedelta(data["service_interval"]*365/12)
return data
class Meta:
model = Snippet
fields = [
'url',
'service_interval',
'next_service',
# also you need to include the fields defined on the serializer here:
'owner',
'highlight',
]
推荐阅读
- http - HCL Domino:如何删除使用 LtpaToken 登录的用户
- reactjs - Visual Studio 2019 测试资源管理器中的 Jest 单元测试
- android - 如何避免recyclerview中每个小部件的requestModelBuild
- android - 如何在android中将菜单设置为应在片段中显示的工具栏
- python - 在文本中查找完全匹配
- javascript - 在 Java 中修改 Netlogo 扩展 API
- git - git 在 Mercurial 中显示等效项
- vhdl - 有没有办法在 vhdl 的 case 语句中创建循环?
- java - 如果 compareAndSet 失败,下面的代码是否仍然执行?
- javascript - 字符串变量作为类对象传递给函数