Пользователь ForiegnKey теперь отображается как поле в наборе django rest framework - PullRequest
2 голосов
/ 17 мая 2019

Я создаю серверную часть для веб-приложения, используя django rest framework. У меня есть модель профиля, в которой пользователь forieingkey ссылается на пользователя django. Все загружается правильно, за исключением одной проблемы, которая заключается в том, что поле User не отображается в URL-адресах внутреннего интерфейса django rest Framework, чтобы я мог назначить пользователя для объекта профиля, который я хочу создать ... Кто-нибудь знает, почему это происходит? ...

enter image description here

models.py:

class Profile(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.CASCADE
    )
    synapse = models.CharField(max_length=25, null=True)
    bio = models.TextField(null=True)
    profile_pic = models.ImageField(
        upload_to='./profile_pics/',
        max_length=150
    )
    facebook = models.URLField(max_length=150)
    twitter = models.URLField(max_length=150)
    updated = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username + ' profile'

Viewset:

from users.models import Profile
from users.api.serializers.ProfileSerializer import ProfileSerializer
from rest_framework import viewsets

class ProfileViewSet(viewsets.ModelViewSet):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'user__username'

URL:

from users.api.views.ProfileView import ProfileViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'', ProfileViewSet, base_name='profile')
urlpatterns = router.urls

сериализатору:

from rest_framework import serializers

from users.models import Profile

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = (
            'id',
            'user',
            'synapse',
            'bio',
            'profile_pic',
            'facebook',
            'twitter'
        )
        depth=2

1 Ответ

0 голосов
/ 17 мая 2019

Это происходит, когда вы устанавливаете глубину больше 0 , поля внешнего ключа становятся недоступными для редактирования (если вы отправляете POST с этим полем, содержащим некоторое значение, DRF viewset игнорирует его, и если поле имеет значение требуется, это вызовет исключение).

Одним из решений для этого является переопределение to_representation() метода сериализатора, установка глубины и восстановление его на ноль:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = (
            'id',
            'user',
            'synapse',
            'bio',
            'profile_pic',
            'facebook',
            'twitter'
        )

    def to_representation(self, instance):
        self.Meta.depth = 2
        representation = super().to_representation(instance)
        self.Meta.depth = 0

        return representation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...