Django Rest Framework использовать источник для доступа к другой модели с обратной связью? - PullRequest
0 голосов
/ 01 сентября 2018

У меня следующая проблема, у меня есть модель пользователя по умолчанию и модель профиля. Я хочу объединить их в один сериализатор, но без вложенности - это просто безобразно. Вместо этого я хочу, чтобы все их поля были на первом уровне. Поэтому я создал следующее (для простоты профиль содержит только одно поле Bool и одно поле отношения):

class UserSerializer(serializers.ModelSerializer):
    achievements = serializers.PrimaryKeyRelated(many=True, queryset=Achievements.objects.all())
    trusted = serializers.BooleanField()

    def create(self, validated_data):
        user=User.objects.create_user(
            password = validated_data['password'],
            username = validated_data['username'],
            email = validated_data['email'],
        )

        Profile.objects.update_or_create(user, defaults={
            'trusted': validated_data['trusted'],
            'achievements': validatd_data['achievements'],
            }
        )
        return user

    class Meta:
        model = User
        fields = ("id", "username", "email", "password", "trusted", "achievements"),
        read_only = ("id",)
        extra_kwargs = {
            'password': {
                'write_only': True,
            },
        }

Профиль подключен к пользователю через поле пользователя, содержащее models.OneToOneField экземпляр.

Когда я пытаюсь составить список всех профилей, я получаю сообщение об ошибке, которое мне нужно указать source, но я понятия не имею, как и в документации упоминается только то, что следует использовать точечную запись.

Спасибо.

1 Ответ

0 голосов
/ 01 сентября 2018

source - аргумент поля сериализатора. Вы должны сделать что-то вроде этого:

class UserSerializer(serializers.ModelSerializer):
    achievements = serializers.PrimaryKeyRelated(many=True, queryset=Achievements.objects.all(), source='profile.achievements')
    trusted = serializers.BooleanField(source='profile.trusted')

    def create(self, validated_data):
        user=User.objects.create_user(
            password = validated_data['password'],
            username = validated_data['username'],
            email = validated_data['email'],
        )

        Profile.objects.update_or_create(user, defaults={
            'trusted': validated_data['trusted'],
            'achievements': validatd_data['achievements'],
            }
        )
        return user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...