Можно ли показывать SlugRelatedField и HyperlinkedRelatedField из одного поля модели в браузере DRF API? - PullRequest
1 голос
/ 21 мая 2019

В моей модели User у меня есть поле "Страна", которое является полем ForeignKey для моей модели Country.

В браузере API DRF я хочу показать два значения из этого:

Название страны через 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 для отображения названия страны вместо идентификатора должно быть read_only - либо это, либо мне нужно переопределитьget_queryset.Я не уверен, как будет выглядеть get_queryset, но это ли способ отображения страны при создании или обновлении форм в браузере API?Может кто-нибудь привести пример get_queryset?

...