Чтение и запись полей внешнего ключа в 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/