当前位置: 首页 > 知识库问答 >
问题:

具有ChoiceField的Django Rest框架

苏彭薄
2023-03-14

我的用户模型中有几个字段是choice字段,并且正在尝试找出如何将其最好地实现到Django Rest框架中。

下面是一些简化的代码来显示我正在做什么。

# models.py
class User(AbstractUser):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )

    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


# serializers.py 
class UserSerializer(serializers.ModelSerializer):
    gender = serializers.CharField(source='get_gender_display')

    class Meta:
        model = User


# viewsets.py
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

基本上,我要做的是让get/post/put方法使用choice字段的display值,而不是代码,类似于下面的JSON。

{
  'username': 'newtestuser',
  'email': 'newuser@email.com',
  'first_name': 'first',
  'last_name': 'last',
  'gender': 'Male'
  // instead of 'gender': 'M'
}

我该怎么做呢?上面的代码不起作用。之前,我有这样的东西用于GET,但用于post/put会给我带来错误。我正在寻找如何这样做的一般建议,似乎这将是一些常见的东西,但我找不到例子。要么就是我做错了什么。

共有1个答案

丘智志
2023-03-14

这个线程的更新,在DRF的最新版本中,实际上有一个ChoiceField。

因此,如果要返回display_name,您所需要做的就是将choicefieldto_representation方法子类化,如下所示:

from django.contrib.auth import get_user_model
from rest_framework import serializers

User = get_user_model()

class ChoiceField(serializers.ChoiceField):

    def to_representation(self, obj):
        if obj == '' and self.allow_blank:
            return obj
        return self._choices[obj]

    def to_internal_value(self, data):
        # To support inserts with the value
        if data == '' and self.allow_blank:
            return ''

        for key, val in self._choices.items():
            if val == data:
                return key
        self.fail('invalid_choice', input=data)


class UserSerializer(serializers.ModelSerializer):
    gender = ChoiceField(choices=User.GENDER_CHOICES)

    class Meta:
        model = User

因此不需要更改__init__方法或添加任何附加包。

 类似资料:
  • 问题内容: 我正在尝试解决以下问题: 我有一个网页,只能看到主持人。此页面上显示的字段(在用户注册后): 用户名,名字+姓氏,电子邮件,状态,相关性等。 我需要使用此字段显示具有存储在db中的所有用户信息的表,但是其中两个字段可以选择,因此我想选择让主持人可以选择另一个选项,并且在单击“更新”按钮后,该字段将被更新为选择的用户。 我可以显示“状态”和“相关性”字段的所有选择,并且在从下拉列表中选择

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 在我的项目中,我需要使用自定义对话框,而不是AlertDialog。但我有两个问题与对话框风格: 宽度太小 我无法删除标题空间 所以,我需要 但是你可以得到: 呼叫代码: 布局XML: 如何解决这个问题?请帮帮忙。

  • 如何解决这个问题??。我在CRUD板条箱描述,但为什么看起来像这样?有人能帮帮我吗?请..这就是结果

  • 我想创建一个透明的圆形按钮,点击它应该有条带边框。我想用HTML、CSS或者必要的java脚本来实现这一点。 以下是一个示例:https://jsfiddle.net/chrichrichri/a9dpg582/38/ 结合: 到目前为止,我在Firefox中对其进行了测试-边框图像考虑了边框半径,但始终存在边框颜色覆盖-如果我有50%的透明度,我会看到条带和选定的颜色-但我只想要条带…如果我使用