Копирование данных из экземпляра родительской модели при сохранении экземпляра дочерней модели - PullRequest
0 голосов
/ 24 января 2020

У меня есть родительская модель, которая содержит базу данных уникальных записей следующим образом (усечено - есть еще много полей):

models.py - родительский элемент

class DBPlatform(models.Model):

    description = models.CharField(max_length=300, unique=True)
    PDS_date = models.DateField()
    PDS_version = models.CharField(max_length=50, blank=True)

Я использую эту модель, чтобы создать дочернюю модель, чтобы я не копировал все поля. Дочерняя модель сохраняет указанные c созданные пользователем экземпляры родительских записей. Они хранятся отдельно, так как они могут быть отредактированы пользователем:

models.py - child

class Platform(DBPlatform):

    scenario = models.ForeignKey(Scenario,
                                 on_delete=models.CASCADE,
                                 related_name="platforms")
    database_platform = models.ForeignKey(DBPlatform,
                                          on_delete=models.CASCADE,
                                          related_name="instances")
    edited = models.BooleanField()

Я использую Django REST Framework для создания API для возможного приложения. Когда дочерняя модель создана, я хочу обновить все ее унаследованные поля с полями родительской модели. Невероятно запутанные шаги, которые я предпринял (которые не работают), находятся в файле views.py дочернего режима. Следующее:

api.views.py - child

class PlatformViewSet(viewsets.ModelViewSet):
    lookup_field = "id"
    serializer_class = PlatformSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        db_id = self.request.data["database_platform"]
        database_platform = get_object_or_404(DBPlatform, id=db_id)

        datadict = self.request.data.dict()
        datadict.update(database_platform.__dict__)

        query_dict = QueryDict('', mutable=True)
        query_dict.update(datadict)

        self.request.data = query_dict

        serializer.save()

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

РЕДАКТИРОВАТЬ : Комментарий Руддры заставил меня считать, что весь шаблон проектирования неисправен. Должен ли я использовать одну модель и логический флаг для экземпляра шаблона?

1 Ответ

1 голос
/ 24 января 2020

Данные serializer не изменяются операциями до serializer.save(). Если вы хотите сделать это таким образом, вам придется отредактировать serializer или повторно сериализовать данные.

Если это не нужно делать только через API и только на этой конечной точке, я ' d предложил бы перезаписать метод модели save или использовать сигнал pre_save. Чтобы убедиться, что эта операция выполняется только при создании нового экземпляра, вы можете проверить, имеет ли self (в случае перезаписи save) или instance (в случае сигнала) id.

...