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 端点

如何限制来自 GraphQL API 端点的匿名用户?

如何在 Django REST Swagger 中生成响应消息列表?

使用 Flask 从 API 调用端点的正确方法

如何通过 Cognito 用户 ID 限制访问 AWS API Gateway 端点