multiplechoicefield - 如何在每次页面加载时更新选择列表

multiplechoicefield - how to update the list of choices on each page load

我在此处显示了一个多选字段:

 ratesheets = serializers.MultipleChoiceField(choices=RATESHEET_CHOICES, allow_blank=False)

和 RATESHEET_CHOICES 填充在这里(也在上下文中显示以上内容):

class RatesheetsComparisonSerializer(serializers.HyperlinkedModelSerializer):

    RATESHEET_CHOICES = []

    def __init__(self, *args, **kwargs):
        for rs in RateSheet.objects.all():
            self.RATESHEET_CHOICES.append((rs.pk, rs.title))
        super(RatesheetsComparisonSerializer, self).__init__(*args, **kwargs)

...

    ratesheets = serializers.MultipleChoiceField(choices=RATESHEET_CHOICES, allow_blank=False)

我遇到的唯一问题是 MultipleChoiceField 在我重新启动服务器之前保持不变。每次加载页面时如何更新选项。我是否需要将相同的代码放在其他地方?我花了很长时间才来到这里,我找不到任何关于这种似乎对我有帮助的东西。谢谢!

添加 ratesheets 字段不是作为 class 变量(它们是静态的!)而是在 __init__ 方法中:

class RatesheetsComparisonSerializer(serializers.HyperlinkedModelSerializer):

    def __init__(self, *args, **kwargs):
        super(RatesheetsComparisonSerializer, self).__init__(*args, **kwargs)
        RATESHIELD_CHOICES = []
        for rs in RateSheet.objects.all():
            RATESHEET_CHOICES.append((rs.pk, rs.title))
        self.fields['ratesheets'] = serializers.MultipleChoiceField(choices=RATESHEET_CHOICES, allow_blank=False)

(我假设这些序列化程序的工作方式类似于 Django 表单,self.fields 是一个猜测,该字典的名称可能不同)

编辑:还需要一件事

更改 Meta class 来自:

class Meta:
    model = RatesheetsComparison
    fields = ('created', 'ratesheets',)
    read_only_fields = ('created',)

至:

class Meta:
    model = RatesheetsComparison
    fields = ('created',)
    read_only_fields = ('created',)

否则您将收到 ImportError,因为它认为费率表存在但找不到它。