【发布时间】:2019-05-20 14:51:59
【问题描述】:
使用 DRF,我有一个包含地址字段的用户模型,它是一个文本字段。当我在 API 浏览器中查看 UserList 端点时,地址如下所示:
"address": "<django.db.models.fields.TextField>",
从文档中,我认为我的序列化程序中需要这个:
address = serializers.CharField(
max_length=1000,
style={'base_template': 'textarea.html'},
)
...但这并没有解决问题。 PhoneNumberField 类型字段也发生了同样的事情:
"phone_number": "<phonenumber_field.modelfields.PhoneNumberField>",
我在序列化程序中将它们重新定义为 CharField。
更新:
我的模型和序列化程序比平时复杂一些,因为我将地址、国家和三个电话字段拆分为单独的类,以便它们可以包含在几个不同的模型中。
我的用户模型:
class User(AbstractUser, AddressPhoneModelMixin):
objects = UserProfileManager()
USERNAME_FIELD = 'email'
type = models.CharField(
max_length=25,
)
title = models.CharField(
max_length=100,
blank=True,
null=True,
)
timezone = models.CharField(
max_length=50,
)
birthdate = models.DateTimeField(
blank=True,
null=True,
)
is_verified = models.BooleanField(
default=False,
)
email = models.EmailField(
unique=True,
db_index=True,
)
这是地址和电话字段的模型类:
class AddressPhoneModelMixin(object):
address = models.TextField(
blank=True,
null=True,
)
country = models.ForeignKey(
Country,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
phone_number = PhoneNumberField(
blank=True,
null=True,
)
mobile_number = PhoneNumberField(
blank=True,
null=True,
)
fax_number = PhoneNumberField(
blank=True,
null=True,
)
class Meta:
abstract = True
用户序列化器:
class UserSerializer(AddressPhoneSerializerMixin, serializers.ModelSerializer):
permission_classes = (permissions.IsAuthenticated,)
url = serializers.HyperlinkedIdentityField(view_name="users:user-detail")
class Meta:
model = User
fields = (
'url',
'id',
'type',
'username',
'first_name',
'last_name',
'full_name',
'email',
'address',
'country',
'phone_number',
'mobile_number',
'fax_number',
'is_superuser',
'is_staff',
'is_active',
'is_verified',
'date_joined',
'last_login',
)
地址和电话字段序列化器:
class AddressPhoneSerializerMixin(serializers.Serializer):
address = serializers.CharField(
max_length=1000,
style={'base_template': 'textarea.html'},
)
country = serializers.HyperlinkedIdentityField(
view_name='countries:country-detail'
)
phone_number = serializers.CharField(
max_length=31,
)
mobile_number = serializers.CharField(
max_length=31,
)
fax_number = serializers.CharField(
max_length=31,
)
class Meta:
abstract = True
最后是用户视图:
class UserList(ListCreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(RetrieveUpdateAPIView):
permission_classes = (permissions.IsAuthenticated,)
queryset = User.objects.all()
serializer_class = UserSerializer
我将包含一个来自 API 浏览器的示例,其中包含所有相关字段。请注意,Country 按预期显示。
"email": "admin@virticl.api",
"address": "<django.db.models.fields.TextField>",
"country": "http://virticl.api/countries/1/",
"phone_number": "<phonenumber_field.modelfields.PhoneNumberField>",
"mobile_number": "<phonenumber_field.modelfields.PhoneNumberField>",
"fax_number": "<phonenumber_field.modelfields.PhoneNumberField>",
【问题讨论】:
-
您可以添加您的视图以及序列化程序吗?]
标签: django django-rest-framework