使用DRF,我有一个User模型,其中包括一个Address字段,它是一个TextField。当我在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浏览器的示例,其中包含所有有问题的字段。请注意,国家/地区会按预期显示。
"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>",
答案 0 :(得分:1)
您的抽象模型mixin应该是models.Model
子类:
class AddressPhoneModelMixin(models.Model):
...
由于继承是从右向左处理的,因此您还需要按照用户模型的基类的顺序将其放在左侧:
class User(AddressPhoneModelMixin, AbstractUser):
...
注意:在specify serializer fields中,您可以使用fields = '__all__'
而不是单独列出它们。如果只缺少一两个,则可以改用exclude
。