Чтение и запись полей внешнего ключа в Django

Я использую Django rest framework для проекта. В проекте есть модель Student, которая имеет внешний ключ, ссылающийся на объект user.

class Student(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE
    )

Когда я читаю из Student, я также хотел бы получить все поля вложенного пользователя. Я могу сделать это с помощью вложенных сериализаторов:

class StudentSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    
    class Meta:
        model = Student
        fields = '__all__'

Однако, если я хочу создать нового пользователя, я не могу использовать тот же сериализатор, потому что нет способа передать внешний ключ полю user, а Django не поддерживает вложенные create.

В настоящее время я использую дополнительное поле user_id = serializers.IntegerField(write_only=True) для получения внешнего ключа для записи, и настроил метод create для обработки логики. Я также попробовал использовать два разных сериализатора для создания и получения данных. Оба способа сработали, но мне просто интересно, есть ли более интуитивный способ реализовать это? Может быть, более удобный или стандартный способ? Есть ли какой-то синтаксис, который работает как: if read: user = UserSerializer(), который позволяет избежать создания двух разных вещей для одного поля сериализатора при разных условиях?

Я думаю, что вы должны следовать документам https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

class StudentSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    
    class Meta:
        model = Student
        fields = '__all__'

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        validated_data["user"] = User.objects.create(user_data)
        student = Student.objects.create(**validated_data)
        return student

Вы также можете подумать о том, чтобы сделать это в одной транзакции. https://docs.djangoproject.com/en/4.0/topics/db/transactions/

Вернуться на верх