Django - 如何通过 API 端点使用 rest_framework 动态地将多个对象添加到数据库中
Posted
技术标签:
【中文标题】Django - 如何通过 API 端点使用 rest_framework 动态地将多个对象添加到数据库中【英文标题】:Django - How to add multiple objects to a database dyanmically via a API endpoint use rest_framework 【发布时间】:2022-01-22 08:38:41 【问题描述】:Django 支持一种方法,允许您使用 Objects.create_bulk() 查询数据库并向其中添加多个对象
我在 google 上看了一下,以便更好地了解如何使用此方法,但我不确定如何实现我想要实现的目标。
这是我目前所处的位置: 我创建了一个 api 端点,列出了当前存在的所有清单对象 我还创建了一个 API 端点,允许您按 playerId 过滤并返回玩家拥有的所有库存物品
这是我想要做的: 创建一个 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)
所以用这样的一些数据来访问这个端点 -> 玩家ID:1, 元素ID:1, 元素ID:1, 元素ID:1, 元素ID:2, 元素ID:2, 元素ID: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 方法的人,他们在其中硬编码发布的数据。如果有更好的方法来实现我想要实现的目标,那么我会全力以赴!提前致谢
【问题讨论】:
``` playerId:1, elementId: 1, elementId: 1, elementId: 1, elementId: 2, elementId: 2, elementId: 7, ``` 是这样的数据只有 @shivankgtm 我不明白你的问题 【参考方案1】:解决方案:迁移到 Postgres,在这种情况下,在我的模型上使用 ArrayField 方法解决了这个问题。
【讨论】:
以上是关于Django - 如何通过 API 端点使用 rest_framework 动态地将多个对象添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用flutter Dropdown小部件从Django REST API端点填充数据
django 在 heroku 上部署单独的 web 和 api 端点