已关闭。此问题需要更多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工具中,有没有什么特别的工具可以查看请求的内容?我有时会遇到很多错误,比如方法类型错误,或者请求参数的设置问题,这很难调试。
任何教程/链接都很感激。
1条答案
按热度按时间rxztt3cl1#
我建议你看看Django REST框架模型视图集
这非常适合你的用例。你基本上想对模型进行crud操作,这个ModelViewSet将允许你列出,创建,删除,更新,获取(单个)。如果你只需要列表,创建,你可以简单地删除相应的mixin。
字符串
然后,如果你想在你的ViewSet中做一个特定的过滤器,包括django-filter包是有意义的,它允许你放入一个
filterset_fields
,见下文:型
在这个例子中,我允许从url中过滤查询集,如下所示:
localhost:8000/calculations/?project=3
个然后,它将只得到具有
project_id
3
的计算。请注意,在您的端点中,您也会引入SQL注入的安全风险。您没有对
game_id
进行验证,这意味着黑客可能会放入恶意SQL查询,这将比您的应用程序想要提供的访问权限更大。