首页 > 解决方案 > 如何根据前一个字段的选择自动生成字段

问题描述

我在 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”,以便它根据需要生成日期,但可能在未来几个月。

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


您可以通过覆盖序列化程序的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',
        ]

推荐阅读