Как сохранить сущность, которая имеет внешний ключ для пользователя в django rest framework? - PullRequest
0 голосов
/ 22 марта 2019

В моем проекте django rest Framework у меня есть модель с именами Profile, в которой есть forignkey для пользователя (для хранения сторонних переменных, таких как адрес и т. Д.).

class Profile(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    # other user data
    title = models.TextField(max_length=50, blank=False)
    contact_number = models.TextField(max_length=12, blank=True)
    description = models.TextField(max_length=500, blank=True)
    location = models.TextField(max_length=200, blank=True)

Что мне нужно знать, как написать класс сериализатора и View для создания профиля.Когда новый пользователь удаляет из приложения, соответствующий профиль также должен быть удален. Проблема : как написать класс сериализатора и просмотреть для создания профиля.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вы можете просто сделать это (в этом коде информация о пользователе берется непосредственно из request.user, который является зарегистрированным пользователем):

class ProfileSerializer(serializers.ModelSerializer):

    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    class Meta:
        model = Profile
        fields = '__all__'

и использовать универсальное представление для создания профиля:

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated


class UserList(generics.CreateAPIView):
    model = Profile
    serializer_class = ProfileSerializer
    permission_classes = (IsAuthenticated,)
1 голос
/ 22 марта 2019

Есть несколько способов сделать это.Самый простой способ - добавить пользовательские поля в сериализатор профилей по одному, используя source mappings;

class ProfileSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')
    password = serializers.CharField(source='user.password', write_only=True)

    class Meta:
        model = Profile
        fields = ('title', 'contact_number', 'description', 'location', 'username', 'email', 'password')

    def create(self, data):
        user_data = data.pop('user')
        user = User.objects.create_user(**user_data)
        profile = Profile.objects.create(user, **data)
        return profile

Другой вариант - создать класс сериализатора для User и использовать доступный для записивложенные сериализаторы.Таким образом, вы можете выполнить проверку и создание экземпляров User в своем собственном сериализаторе и использовать этот сериализатор внутри ProfileSerializer.

При любом подходе вам не нужно ничего менять на стороне представления, вся эта логикабудет обработан в сериализаторах.

Что касается удалений, так как вы определили отношение ForeignKey с on_delete = models.CASCADE , если вы удаляете экземпляр пользователя, связанный экземпляр профиля будет удален.Но вам нужно написать собственный метод удаления, если вы хотите сделать это иначе (удалить пользователя при удалении соответствующего профиля).Но если вам нужна такая тесная связь между пользователем и профилем, лучшим способом было бы расширить класс User, чтобы иметь собственную пользовательскую модель, как предложил Аариф.

...