是否可以从DRF API浏览器中的单个模型字段显示SlugRelatedField和HyperlinkedRelatedField?

时间:2019-05-21 14:54:27

标签: django django-rest-framework

在用户模型中,我有一个“国家/地区”字段,这是我的国家/地区模型的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吗?

0 个答案:

没有答案