【问题标题】:How to automatically generate a field based on the choice of a previous field如何根据前一个字段的选择自动生成字段
【发布时间】:2021-03-17 01:25:16
【问题描述】:

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

【问题讨论】:

  • 我认为你应该在字段中包含 next_service 然后定义 self.fields['next_service'] = ...
  • 当我尝试这样做时,我得到了TypeError: list indices must be integers or slices, not str

标签: django django-models django-rest-framework django-serializer


【解决方案1】:

你可以通过覆盖the serializer's 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',
        ]

【讨论】:

  • 谢谢。我不得不改变一些事情,并从我之前取出的字段中保留了这些字段。不过,我现在可以正常工作了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多