Использование 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() сериализатора), поэтому я просто беспокоюсь, что есть более простой, более лаконичный способ сделать это, который я как-то упустил.

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