Внешний первичный ключ DRF, который автоматически увеличивается с помощью вложенных сериализаторов для каскадной вставки
Я хочу вставить модель беседы, у которой есть дочерний класс, в модель сообщения.
Я также хочу использовать один метод Viewset для сохранения.
Сообщение имеет внешний ключ к первичному ключу беседы.
Я ищу что-то похожее на реализацию класса java + spring, где Parent ссылается на класс Child.
Родитель и ребенок имеют аннотацию auto_increment. Spring JPA save вызывается и вставка идет каскадно.
Родительский класс:
int id;
Child reference;
Детский класс:
int child_id;
int parent_id;
Метод обслуживания:
parent.setReference(child);
jpa.save(parent); // both parent and child is inserted
Есть ли что-то подобное для Django Rest Framework? Или Django Framework?
JSON:
{
"model": "conversation",
"id": auto_increment,
"title": "chat",
"message": {
"model": "message",
"conversation_id": value from id in conversation model,
"message": "hi"
}
}
2 ответа
То, что вы ищете, это доступные для записи вложенные сериализаторы. Также все модели django имеют первичный ключ с автоинкрементом по умолчанию, или вы можете добавить собственное поле автоинкремента.
По умолчанию вложенные сериализаторы доступны только для чтения. Если вы хотите поддерживать операции записи во вложенном поле сериализатора, вам нужно создать методы create() и / или update(), чтобы явно указать, как следует сохранять дочерние отношения.
Вот пример записываемого вложенного сериализатора с использованием альбомов и дорожек.
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('id', 'order', 'title', 'duration', 'album_id')
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('id', 'album_name', 'artist', 'tracks')
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album
>>> data = {
'id': 1,
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
{'id': 1, 'order': 1, 'title': 'Public Service Announcement', 'duration': 245, 'album_id': 1},
{'id': 2, 'order': 2, 'title': 'What More Can I Say', 'duration': 264, 'album_id': 1},
{'id': 3, 'order': 3, 'title': 'Encore', 'duration': 159, 'album_id': 1},
],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>
Зачем вам нужно иметь "идентификатор" в JSON.
Удалите его из сериализатора DRF, и django ORM будет автоматически увеличивать идентификатор для каждой новой записи. По умолчанию поле id модели увеличивается автоматически.