Создание нескольких экземпляров моделей взаимосвязанных моделей с помощью одного пост-запроса в DRF - PullRequest
0 голосов
/ 17 марта 2019

Я хочу создать две записи из одного почтового запроса. Один в модели «Даты» и один в модели «Другое». Код, соответствующий обеим моделям, показан ниже.

class Dates(models.Model):
  booking_id = models.AutoField(primary_key=True)
  timestamp = models.DateTimeField(auto_now_add=True)
  feedback = models.CharField(max_length=8, default='no')
  myself = models.BooleanField(default=True)

  class Meta:
    app_label = 'bookings'

Другое:

class Other(models.Model):
  booking_id = models.OneToOneField(
                'bookings.Dates',
                null=False,
                default=1,
                primary_key=True,
                on_delete=models.CASCADE
            )
  name = models.CharField(max_length=64)
  phone_number = models.CharField(max_length=14)
  email_id = models.EmailField(max_length=128)

  class Meta:
    app_label = 'bookings'

Я проверил данные из сериализатора дат и создал объект в таблице дат. Теперь я хочу использовать сгенерированный 'booking_id' и тот же 'booking_id' для таблицы 'Другие'. Как я могу проверить сериализатор и создать объект в таблице «Прочее» при сохранении согласованности? Здесь с согласованностью я имею в виду: либо создайте объекты в обеих таблицах, если ошибки не происходит, либо не создавайте объект, если возникла ошибка.

1 Ответ

1 голос
/ 17 марта 2019

Для этого вы можете использовать вложенные сериализаторы с возможностью записи.Вам необходимо определить класс сериализатора для модели Other, тогда ваш сериализатор Dates может выглядеть следующим образом:

class DatesSerializer(serializers.ModelSerializer):
    other = OtherSerializer()

    class Meta:
        model = Dates
        fields = ('timestamp', 'feedback', 'myself', 'other')

    def validate_other(self, value):
        # Run validations for Other model here, either manually or through OtherSerializer's is_valid method. You won't have booking_id in value here though, take that into account when modelling your validation process

    def validate_feedback(self, value):
        # Run validations specific to feedback field here, if necessary. You can do this for all serializer fields

    def validate(self, data):
        # Run non-field specific validations for Dates here

    def create(self, validated_data):
        # At this point, validation for both models are run and passed

        # Pop other model data from validated_data first
        other_data = validated_data.pop('other')

        # Create Dates instance 
        dates = Dates.objects.create(**validated_data)

        # Create Other instance now
        Other.objects.create(booking_id=dates, **other_data)

        return dates

Здесь вы можете использовать значение по умолчанию CreateModelMixin для DRF, вся логика вложенных объектов обрабатывается в сериализаторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...