Django:关于API视图的一般问题[已关闭]

mbzjlibv  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(129)

已关闭。此问题需要更多focused。目前不接受回答。
**要改进此问题吗?**更新此问题,使其仅针对editing this post的一个问题。

5天前关闭。
Improve this question
我正在做一个项目,我在React中有一个前端,它可以对Django服务器进行一些基本的CRUD axios调用。
我试图找出管理Django视图以接收和处理这些请求的最佳方法。我明白这在很大程度上取决于我的应用程序需要如何运行。但目前,我只是试图创建简单的视图(将几个数据模型连接在一起并返回)
这是一种实际做法:

class Hero(models.Model):
    character = models.ForeignKey(
        Card, on_delete=models.CASCADE, related_name="class_id", null=True
    )
    weapon = models.ForeignKey(
        Card, on_delete=models.CASCADE, related_name="weapon_id", null=True
    )
    player = models.OneToOneField(Player, on_delete=models.PROTECT, null=True)

class Game(models.Model):
    hero1 = models.ForeignKey(
        Hero, on_delete=models.PROTECT, related_name="hero1_id", null=True
    )
    hero2 = models.ForeignKey(
        Hero, on_delete=models.PROTECT, related_name="hero2_id", null=True
    )
    hero3 = models.ForeignKey(
        Hero, on_delete=models.PROTECT, related_name="hero3_id", null=True
    )
    hero4 = models.ForeignKey(
        Hero, on_delete=models.PROTECT, related_name="hero4_id", null=True
    )

字符串
然后我会写一个视图

class GameHeroView(APIView):
    serializer_class = HeroSerializer

    def get(self, request, id=0):
        game_id = request.query_params.get("id")
        if game_id is None:
            game_id = id

        # Create an empty list for serialized data
        serialized_data = []

        sql = (
            " \
              SELECT gh.* \
                FROM gauntlet_game gg, \
                     gauntlet_hero gh \
              WHERE gg.id = "
            + str(game_id)
            + " \
                AND (gg.hero1_id = gh.id \
                    OR gg.hero2_id = gh.id \
                    OR gg.hero3_id = gh.id \
                    OR gg.hero4_id = gh.id)"
        )

        heros = Hero.objects.raw(sql)
        serialized_data = HeroSerializer(heros, many=True).data

        # Create the custom response object
        response_data = {
            "count": len(serialized_data),
            "next": None,  # You can set this to the next page URL if pagination is used
            "previous": None,  # You can set this to the previous page URL if pagination is used
            "results": serialized_data,
        }
        return Response(response_data)


例如,在这里,我想获得每个游戏条目(已经存在)的所有英雄。我目前采取的方法是,
1.为每种情况专门创建一个新的视图类,
1.为每个视图定义get、post、put等方法。
所以,例如,如果我需要为一个game_id更新所有英雄,我可以在这个类中实现一个put方法。除了这些方法,不应该存在其他方法,只应该创建一个新类。
以下是我的问题:
1.这是一个可行的方法,还是我的限制。
1.在django工具中,有没有什么特别的工具可以查看请求的内容?我有时会遇到很多错误,比如方法类型错误,或者请求参数的设置问题,这很难调试。
任何教程/链接都很感激。

rxztt3cl

rxztt3cl1#

我建议你看看Django REST框架模型视图集
这非常适合你的用例。你基本上想对模型进行crud操作,这个ModelViewSet将允许你列出,创建,删除,更新,获取(单个)。如果你只需要列表,创建,你可以简单地删除相应的mixin。

class ModelViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.UpdateModelMixin,
               mixins.DestroyModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):

字符串
然后,如果你想在你的ViewSet中做一个特定的过滤器,包括django-filter包是有意义的,它允许你放入一个filterset_fields,见下文:

class CalculationViewSet(viewsets.ModelViewSet):
    queryset = Calculation.objects.all()
    serializer_class = CalculationSerializer
    filterset_fields = {
        'project': ["exact"],
    }


在这个例子中,我允许从url中过滤查询集,如下所示:
localhost:8000/calculations/?project=3
然后,它将只得到具有project_id3的计算。
请注意,在您的端点中,您也会引入SQL注入的安全风险。您没有对game_id进行验证,这意味着黑客可能会放入恶意SQL查询,这将比您的应用程序想要提供的访问权限更大。

相关问题