【问题标题】:How to serialize ChoiceFields in Django Rest Framework?如何在 Django Rest Framework 中序列化 ChoiceFields?
【发布时间】:2021-04-19 22:13:55
【问题描述】:

第一个 Python 用户,来自 Javascript 世界。我能够从 Django API 检索我序列化为 JSON 的模型,并将其显示在用 React 编写的前端。但是现在我只是在有多个选择的模型中添加了一个字段priority,我很难将这些选择带到前端(我想在下拉列表中显示它们并更新 REST API)。迁移成功,我可以从后端选择选项,但在前端我只是从迁移中获取默认值。这是我现在的代码:

models.py

class Todo(models.Model):
  title = models.CharField(max_length=120)
  description = models.TextField()
  completed = models.BooleanField(default=False)
  priority_choices = [
    ('High', 'High'),
    ('Medium', 'Medium'),
    ('Low', 'Low'),
  ]
  priority= models.CharField(max_length=6, choices=priority_choices, default='Low') #new field

  def __str__(self):
    return self.title

序列化器.py

from rest_framework import serializers
from .models import Todo

      
class TodoSerializer(serializers.ModelSerializer):
  class Meta:
    model = Todo
    fields = ('id', 'title', 'description', 'completed', 'priority')

views.py

class TodoView(viewsets.ModelViewSet):     
  serializer_class = TodoSerializer          
  queryset = Todo.objects.all()   

我只想要最简单的解决方案,最好只更新 serializers.py 中的 TodoSerializer(serializers.ModelSerializer) 类,以便它全部来自这个模型。那可能吗?阅读https://www.django-rest-framework.org/api-guide/fields/#choicefield 对我来说并不清楚我是否需​​要为同一个模型创建一个新类来检索 ChoiceFields,或者是否可以从一个类中完成所有操作,但无论我尝试什么,都会出现语法错误。就像我说的,我对 Python 很陌生。谢谢。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以使用SerializerMethodField 完成此操作

    class TodoSerializer(serializers.ModelSerializer):
        priority_choices = serializers.SerializerMethodField()
    
        def get_priority_choices(self, obj):
            return [choice[0] for choice in Todo.priority_choices]
    
        class Meta:
            model = Todo
            fields = ('id', 'title', 'description', 'completed', 'priority', 'priority_choices')
    

    【讨论】:

    • 这并没有做任何新的事情。我已经有优先工作了。我需要priority_choices。我想从我的前端应用程序访问高、中、低。不仅仅是在记录上设置的单个优先级值。 fields = ('id', 'title', 'description', 'completed', 'priority', priority_choices)可以吗?
    • 明白了。查看我的编辑以完成您想要的
    • 非常感谢!这正是我一直在寻找的。是否可以在不进行任何正则表达式或拆分的情况下仅获取所有选项的第一个或第二个值而不是 [High, High], [Low, Low]
    • 是的,您可以在get_priority_choices 中使用列表推导轻松地做到这一点。更新了我的答案以表明
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2015-07-24
    • 2018-11-21
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多