Сохранение нескольких объектов в Django DRF ViewSet create

У меня есть модель в Django, которая хранит некоторую базовую информацию.

class Inventory(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    added_by = models.ForeignKey(User, on_delete=models.SET("anonymous"),
    name = models.CharField(max_length=100, unique=True)
    nickname = models.CharField(max_length=100, blank=True, null=True)
    manufacturer = models.ForeignKey(InventoryManufacturer, on_delete=models.PROTECT)
    comment = models.TextField(max_length=500, blank=True, null=True)
    link = models.URLField(max_length=100, blank=True, null=True)
    class Meta:
        unique_together = ('manufacturer', 'manufacturer_part_no')

У меня есть другая таблица, в которой хранятся изображения для этой модели:

class InventoryImages(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    added_by = models.ForeignKey(User, on_delete=models.SET("anonymous"),
                                 blank=True, null=True)
    file = ImageField(blank=True, default='', upload_to='inventory/images/%Y/%m/')
    primary = models.BooleanField(default=False)
    order = models.IntegerField(blank=True, null=True)
    item = models.ForeignKey(Inventory, on_delete=models.CASCADE, blank=True, null=True, related_name='images')

Какой правильный способ обработки сценария, в котором пользователь может заполнить форму (где можно установить поля модели Inventory), а также загрузить несколько изображений.

Что я сделал теперь, когда пользователь может загружать изображения каждый раз на этой форме, изображение загружается, но внешний ключ элемента остается нулевым.

Когда пользователь отправляет форму, ForeignKey устанавливается для каждого загруженного изображения. Сценарий, когда изображение отбрасывается (форма не отправляется), обрабатывается.

Вот что я сделал сейчас:

    def create(self, request, *args, **kwargs):
        # Create Inventory item
        serializer = CreateInventoryItemSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save(added_by=self.request.user, updated_by=self.request.user)

        # Save properties
        inventory_id = serializer.data['id']

        # Add id for images
        images = request.data.pop("pictures", None)
        for image in images:
            InventoryImages.objects.filter(id=image['id']).update(item=inventory_id,
                                                                  order=image['order'], primary=image['primary'])

        # Return list type object
        queryset = Inventory.objects.all()
        item = get_object_or_404(queryset, pk=inventory_id)
        list_serializer = InventoryListSerializer(item)
        header = self.get_success_headers(list_serializer.data)
        return Response(list_serializer.data, status=status.HTTP_201_CREATED, headers=header)

Однако мне не очень нравится такой подход:

  • Собственно предмет сохраняется до сохранения изображений (таким образом, если что-то пойдет не так при сохранении изображений, инвентарный предмет уже будет сохранен без изображений)
  • Изображения сохраняются через прямой доступ к объекту модели. Мне также не очень нравится этот вариант, я бы хотел использовать его сериализатор, однако я не знаю, как я могу фильтровать изображения с помощью сериализатора, а также обновлять поле 'item' во всех совпадающих строках InventoryImages.
Вернуться на верх