Использование DRF для обновления всего объекта, включая вложенные объекты
Если у меня есть модели, которые выглядят примерно так:-
class Event(models.Model):
title = models.CharField(max_length=200)
venue = models.ForeignKey(Venue, on_delete=models.PROTECT)
class Venue(models.Model):
# all of this information comes from the Google Places API
place_id = models.CharField(max_length=200)
name = models.CharField(max_length=200)
address = models.TextField()
и я хочу иметь возможность обновлять название места проведения существующего мероприятия, используя Django Rest Framework, похоже, что я должен написать метод update() для моего сериализатора модели.
Я написал это так:
class EventSerializer(serializers.ModelSerializer):
venue = VenueSerializer()
class Meta:
model = Event
fields = ["title", "venue"]
def update(self, instance, validated_data):
venue_data = validated_data.pop("venue", None)
event = super().update(instance, validated_data)
if venue_data:
venue, _ = Venue.objects.get_or_create(
place_id=venue_data["place_id"],
defaults={
"name": venue_data["name"],
"address": venue_data["address"]
},
)
event.venue = venue
event.save()
return event
Похоже ли это на то, что я иду в правильном направлении? Я не хочу создавать новое место каждый раз, когда кто-то обновляет событие - если ID места совпадает с существующим, я хочу использовать его повторно.
Этот код выглядит немного громоздким для меня (у меня есть очень похожий код в методе create() сериализатора), поэтому я просто беспокоюсь, что есть более простой, более лаконичный способ сделать это, который я как-то упустил.