在用户模型中,我有一个“国家/地区”字段,这是我的国家/地区模型的ForeignKey字段。
在DRF API浏览器中,我要显示两个值:
国家名称,通过SlugRelatedField:
"country": "Zimbabwe",
以及在国家(地区)表中指向相同国家的链接:
"country": "http://virticl.api/countries/249/",
这可能吗?
更新:
这是视图,尽管我认为它没有太大帮助...
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
我的模型和混入...
class AddressPhoneModelMixin(models.Model):
"""
Abstract class to add address and phone fields to a model.
"""
address = models.TextField(
verbose_name=_('Address'),
blank=True,
null=True,
)
country = models.ForeignKey(
Country,
on_delete=models.SET_NULL,
verbose_name=_('Country'),
blank=True,
null=True,
)
phone_number = PhoneNumberField(
verbose_name=_('Phone'),
blank=True,
null=True,
)
mobile_number = PhoneNumberField(
verbose_name=_('Mobile Phone'),
blank=True,
null=True,
)
fax_number = PhoneNumberField(
verbose_name=_('Fax'),
blank=True,
null=True,
)
class Meta:
abstract = True
class User(AddressPhoneModelMixin, AbstractUser):
objects = UserProfileManager()
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 AddressPhoneSerializerMixin(serializers.Serializer):
address = serializers.CharField(
max_length=1000,
style={'base_template': 'textarea.html'},
)
country = serializers.SlugRelatedField(
read_only=True,
slug_field='country_name',
)
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 UserSerializer(AddressPhoneSerializerMixin, serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="users:user-detail")
class Meta:
model = User
fields = (
'id',
'url',
'type',
'username',
'first_name',
'last_name',
'email',
'address',
'country',
'phone_number',
'mobile_number',
'fax_number',
'is_superuser',
'is_staff',
'is_active',
'is_verified',
'date_joined',
'last_login',
)
此外,使用SlugRelatedField来显示country_name而不是id的情况也必须是read_only-要么我需要重写get_queryset。我不确定get_queryset是什么样子,但是在API浏览器中的创建或更新表单上会显示国家/地区名称吗?有人可以举个例子get_queryset吗?