【问题标题】:Django REST Framework - Serializer don't see fieldDjango REST Framework - 序列化程序看不到字段
【发布时间】:2020-03-15 00:58:13
【问题描述】:

我想创建用户,该用户持有他所在国家/地区的外键。 显然我想让它成为必填字段。

但是当我发送没有“国家”字段的 POST 请求时,DRF 序列化程序不会抛出错误。

我在代码中没有任何地方允许该字段为空,它与其余部分相同。

我更进一步,在我的ModelViewSetcreate() 方法中,我决定打印serializer.validated_data

class UserViewSet(ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    permission_classes = []

    def create(self, request, format=None):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            print(serializer.data)

我发送以下 POST 请求:

而我的serializer.validated_data 值是:

OrderedDict([('password', 'test1231112'), ('first_name', 'Jarosław'), ('last_name', 'Psikuta'), ('phone', '2999111331'), ('email', 'rweww@gmail.css'), ('description', 'fajny uzytkownik'), ('address', 'Mieszka 3/4'), ('date_of_birth', datetime.date(1997, 10, 13))])

我意识到序列化程序只是看不到我的 country 字段。

我已经编写了一些代码来检查我的country 字段是否存在:

country_code = request.data.get('country', None)
if not country_code:
        return Response({'country': 'This field is required'}, status=status.HTTP_400_BAD_REQUEST)

但我知道这是错误的做法。这是附加代码,实际上序列化程序应该为我工作。

这里有我的其余代码:

序列化器.py

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = '__all__'
        read_only_fields = ('id', 'last_login', 'is_superuser', 'is_staff', 'is_active','date_joined', 'groups', 'user_permissions')
        extra_kwargs = {
            'password': {'write_only': True}
        }
        depth = 1

    def create(self, validated_data):
        password = validated_data.pop('password')
        user = User(**validated_data)
        user.set_password(password)
        user.save()
        return user

models.py

class User(AbstractUser):
    EMPLOYEE_TYPES = [
        ('R', 'Regular'),
        ('S', 'Specialist')
    ]
    username_validator = None
    username = None
    first_name = models.CharField(_('first name'), max_length=30)
    last_name = models.CharField(_('last name'), max_length=150)
    phone = models.CharField(max_length=15, unique=True)
    employee_type = models.CharField(max_length=1, choices=EMPLOYEE_TYPES, default='R')
    email = models.EmailField(_('email address'), unique=True, max_length=255)
    description = models.CharField(blank=True, max_length=500, default='')
    address = models.CharField(max_length=100)
    date_of_birth = models.DateField(null=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='users')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'date_of_birth', 'address', 'phone', 'country']

【问题讨论】:

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


【解决方案1】:

我从序列化元类中删除了depth = 1,它可以工作。

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多