Django - Как добавить несколько объектов в базу данных дианмически через конечную точку API с использованием rest_framework

Django поддерживает метод, позволяющий запросить базу данных и добавить в нее несколько объектов с помощью Objects.create_bulk()

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

Вот на чем я пока остановился: Я создал конечную точку api, которая перечисляет все предметы инвентаря, существующие на данный момент. Я также создал конечную точку api, которая позволяет фильтровать по ID игрока и возвращает все предметы инвентаря, которыми владеет игрок

Вот что я пытаюсь сделать: Создать конечную точку API, которая позволяет добавлять несколько элементов в инвентарь указанного пользователя (playerId)

Мне просто нужна конечная точка, позволяющая методом POST добавлять несколько элементов к указанному инвентарю игрока, это должно выглядеть примерно так:

def add_multiple_items_to_inventory(request, pk):
    itemsToAdd = Inventory.objects.bulk_create(
[Inventory(
playerId: 1, 
elementId: 2, 
elementId: 2, 
elementId: 2, 
elementId: 4, 
elementId: 7))

    serializer = InventorySerializer(data=itemsToAdd)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

так что попадание в эту конечную точку с некоторыми данными выглядит следующим образом -> { playerId:1, elementId: 1, elementId: 1, elementId: 1, elementId: 2, elementId: 2, elementId: 7, } должны добавить элементы [1,1,1,2,2,7] к игроку с id: 1

views.py:

@api_view(['POST'])
def add_to_inventory(request, pk):
     #tried using Objects.create_bulk(), but unsure sure how to use it for what i'm trying to do
    inventory = Inventory.objects.filter(playerId=pk)
   
    serializer = InventorySerializer(instance=inventory, data=request.data, many=True)
    if serializer.is_valid():
        serializer.save()
    else:
        return Response('Nope')

    return Response(serializer.data)

models.py:

class User(models.Model):
    userId = models.AutoField(primary_key=True)
    username = models.CharField(max_length=16)
    email = models.EmailField(max_length=30)
    
    def __str__(self):
        return str(self.username)


class Player(models.Model):
    playerId = models.ForeignKey(User, on_delete=models.CASCADE)
    credits = models.IntegerField(default=500)
    AP = models.IntegerField(default=100)
    tier = models.IntegerField(default=1)

    def __str__(self):
        return str(self.playerId)


class Elements(models.Model):
    elementId = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    elementTier = models.IntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(5)])

    def __str__(self):
        return str(self.name)


class Inventory(models.Model):
    playerId = models.ForeignKey(Player, on_delete=models.CASCADE)
    elementId = models.ForeignKey(Elements, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.playerId)

Примечание: я буду использовать обычные вызовы javascript ajax для достижения этих конечных точек, поэтому, если решение будет найдено, не могли бы вы также принять во внимание, что мне нужен способ сказать что-то вроде add_element(elementId, quantity), чтобы я мог просто выбрать, какой элемент(ы) добавить, и сколько их добавить. Мне очень жаль, что этот вопрос довольно тяжелый и его можно было бы сформулировать лучше, я искал что-то подобное в интернете, но нашел только людей, использующих метод Object.creat_bulk, где они жестко кодируют данные, которые размещаются. Если есть лучший способ достичь того, что я пытаюсь сделать, то я весь внимание! Заранее спасибо

Решение: Перейдите на Postgres, в этом случае использование метода ArrayField в моей модели решило проблему.

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