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 в моей модели решило проблему.