Как создать запись базы данных с полем промежуточной таблицы в моем классе сериализатора?

Flexbox может это сделать

div {
  margin: 1em auto;
  width: 200px;
  border: 5px solid red;
  display: flex;
  justify-content: flex-end;
  overflow: hidden;
  /* toggel to see overflow */
}

img {
  display: block;
  opacity: .5/* to show overflow */
}
<div>
  <img src="http://www.fillmurray.com/460/300" alt="">
</div>

0
задан Niklas 19 January 2019 в 20:08
поделиться

1 ответ

1117 Есть много вещей, которые вы не совсем поняли. Во-первых, аутентификация. Пожалуйста, ознакомьтесь с DRF-JWT или подобными библиотеками и используйте их классы аутентификации или, по крайней мере, посмотрите, как создать ваши, чтобы ваша аутентификация не была засорена по всему коду.

Что касается perform_create, по вашему мнению, вам не нужно проверять serializer.is_valid() там. Это уже проверено в create до вызова perform_create. И этот метод не предназначен для возврата ответа API, насколько я знаю. Он просто предназначен для выполнения каких-либо дополнительных действий, которые вы хотите, перед вызовом serializer.save(). Для большинства основных применений оно никогда не переопределяется. Вы также можете передать своего пользователя и дату в метод сохранения или сделать это в сериализаторе.

Теперь в методе создания сериализатора вам не требуется доступ initial_data. Все, что вам нужно, должно быть в validated_data. Во-первых, вы должны вытолкнуть puppies из validated_data до вызова objects.create, иначе он не сможет с этим справиться. Теперь вы можете создавать объекты PuppyOrder, используя более ранних щенков.

Вот как вы добавляете дополнительные данные к validated_data сериализатора в представлении execute_create:

serializer.save(date=datetime.today(), user=self.request.user, total_price=total_price)

Вы можете сделать то же самое в методе создания сериализатора, просто добавив элементы непосредственно в проверенные данные. Это всего лишь обычный словарь:

validated_data['user'] = self.context['request'].user
validated_data['date'] = datetime.today()
validated_data['total_price'] = total_price

РЕДАКТИРОВАТЬ: Использование не модельного сериализатора для PuppyOrder

Поскольку порядок и PuppyOrder еще не созданы в то время, когда при отправке запроса следующая строка в OrderSerializer приведет к ошибке, поскольку сериализатор ожидает фактические PuppyOrders

puppies = PuppyOrderSerializer(source='puppyorder_set', many=True)

Вместо этого вы можете использовать не модельный сериализатор, подобный этому (при условии, что щенок уже существует): [ 1124]

class PuppyOrderCreateSerializer(serializers.Serializer):
    puppy = serializers.PrimaryKeyRelatedField(queryset=Puppy.objects.all())
    amount = serializers.IntegerField()

Затем вы можете использовать этот сериализатор в yuur OrderSerializer:

puppies_data = PuppyOrderCreateSerializer(many=True)
0
ответ дан Ken4scholars 19 January 2019 в 20:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: