python 如何在使用源参数时将模型验证传递给ModelSerializer?

brc7rcf0  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(118)

在我的序列化器中,我将模型中的列更改为不同的名称,因为我在API中需要这样做。

  • 型号 *:
class User(models.Model):
   name = models.CharField(max_length=50, null=True)
   telephone_number = models.CharField(max_length=15, null=True, blank=True)
  • 串行器 *:
class UserSerializer(serializers.ModelSerializer):
   phoneNumber = serializers.CharField(source='telephone_number')
   class Meta:
      model = User
      fields = ('name', 'telephone_number')

但是当我这样做的时候,序列化器没有考虑模型中给定的验证集。

>>> serializer = UserSerializer()
>>> print(repr(serializer))
UserSerializer():
    name = CharField(allow_null=True, max_length=50, required=False)
    phoneNumber = CharField(source='telephone_number') <- no max_length here

如何调用这些验证,而不需要将它们复制到序列化器中?(当然,我的模型要大得多,这就是我问的原因)

jgzswidk

jgzswidk1#

当你自己在序列化器主体中声明一个新字段时,它会理解你想要完全覆盖字段的原始定义,并使用你在serializers.CharField()中使用的任何属性。使用source不会像max_length那样自动复制所有其他属性。
一种解决方案是使用to_internal_value作为变通方法,重命名字段,而不必将其所有模型属性复制到序列化程序字段。

class UserSerializer(serializers.ModelSerializer):
   class Meta:
      model = User
      fields = ('name', 'telephone_number')
   
   def to_internal_value(self, data):
      data["telephone_number"] = data["phoneNumber"]
      return super().to_internal_value(data)

这样,您就可以使用phoneNumber作为字段名来接受序列化程序的数据。

相关问题