【问题标题】:JSON/Django http requestJSON/Django http 请求
【发布时间】:2016-03-21 13:28:58
【问题描述】:

我编写了一些 django 代码,允许我请求一些数据并将其返回为 JSON 格式。

我请求:http http://127.0.0.0.8000/api/club

[
    {
        "name": "Liverpool FC",
        "abv": "LFC",
        "stadium": "Anfield",
        "manager": "Jurgen Klopp",
        "trophies": "50"
    },
    {
        "name": "Manchester City",
        "abv": "MC",
        "stadium": "Etihad",
        "manager": "Manuel Pellegrini",
        "trophies": "14"
    },
    {
        "name": "Manchester United",
        "abv": "MU",
        "stadium": "Old Trafford",
        "manager": "Louis Van Gaal",
        "trophies": "46"
    }
]

是否可以只请求“Liverpool FC”的数据以使请求只返回。我可以通过http http://127.0.0.0.8000/api/club/1/ 做到这一点,但我更愿意输入像http http://127.0.0.0.8000/api/club/liverpool/ 这样的团队名称

{
    "name": "Liverpool FC",
    "abv": "LFC",
    "stadium": "Anfield",
    "manager": "Jurgen Klopp",
    "trophies": "50"
}

编辑:添加了两个 py 文件

views.py

    # Create your views here.
    class FishViewSet(viewsets.ModelViewSet):
        # this fetches all the rows of data in the Fish table
        queryset = Fish.objects.all()
        serializer_class = FishSerializer

    # Create your views here.
    class TeamViewSet(viewsets.ModelViewSet):
        # this fetches all the rows of data in the Fish table
        queryset = Team.objects.all()
        serializer_class = TeamSerializer

    # Create your views here.
    class ClubViewSet(viewsets.ModelViewSet):
        # this fetches all the rows of data in the Fish table
        queryset = Club.objects.all()
        serializer_class = ClubSerializer

def getClub(request, club_name):
    queryset = Club.objects.get(name=club_name)

models.py

class Fish(models.Model):
        name = models.CharField(max_length=255)
        created = models.DateTimeField('auto_now_add=True')
        active = models.BooleanField()

class Team(models.Model):
        starting = models.CharField(max_length=255)
        captain = models.CharField(max_length=255)
        value = models.CharField(max_length=255)
        fixtures = models.CharField(max_length=255)
        position = models.CharField(max_length=255)

class Club(models.Model):
        name = models.CharField(max_length=255)
        abv = models.CharField(max_length=255)
        stadium = models.CharField(max_length=255)
        manager = models.CharField(max_length=255)
        trophies = models.CharField(max_length=255)

urls.py

router = routers.DefaultRouter()
#makes sure that the API endpoints work
router.register(r'api/fishes', views.FishViewSet)
router.register(r'api/teams', views.TeamViewSet)
router.register(r'api/club', views.ClubViewSet)

admin.autodiscover()

urlpatterns = router.urls

url(r'^admin/', include(admin.site.urls)),
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
url(r'^/api/club/(?P<club_name>[a-zA-Z]+)/$', ('getClub'))

【问题讨论】:

  • 你需要定义一个 slug 字段。
  • 我认为你的 url 应该是 http://127.0.0.1:8000/api/club?q=liverpool,所以你不需要 slug 字段,q 可以替换为任何其他参数名称。
  • @Gocht 当我执行此操作时,'127.0.0.1:8000/api/club/?abv=MU' 它会返回所有内容,而不仅仅是曼联的 JSON:S
  • @Aceboy1993 这是关于您的代码,当您使用 GET 参数从数据库中检索数据时,您应该向我们展示您的视图代码。
  • 我想你需要重新定义你的查询集,以通过你的 abv 参数过滤

标签: python json django


【解决方案1】:

我知道一个使用正则表达式的简单方法

在 url.py 中添加这个正则表达式

url(r'^/api/club/(?P<club_name>[a-zA-Z]+)/$', ....)

然后在视图中添加一个方法将像这样的 club_name 变量

from django.http import HttpResponse

def getclub(request, club_name):
    teaminfo = ModelName.objects.get(name=club_name) # something like that
    return HttpResponse(teaminfo)

club_name 变量将从正则表达式中获取字符串,您可以随意使用它。

这是一个简单的很好的参考

https://docs.djangoproject.com/en/1.9/intro/tutorial03/

【讨论】:

  • 我这样做了,结果显示“详细信息”:“未找到。”
  • 我添加的正是你所说的,你可以在顶部看到我的代码我已经更新它以反映你建议的更改
  • 抱歉我忘了加return HttpResponse(teaminfo)@Aceboy1993
  • 还是不行。我认为它没有从我的 urls.py 调用 def getClub 函数,但不知道为什么
  • 我认为问题在于 url.py 文件中的('getClub'),你确定这就是你在 django-rest 中调用视图的方式吗? @Aceboy1993
【解决方案2】:

问题是您在视图中使用了queryset = Team.objects.all()。从本质上讲,这意味着您将获得所有对象。

我有一个类似的程序,我像这样使用urls.py-

...
url(r'^teams/(?P<incoming_team>[^/]+)/$', ('team_stats')),
url(r'^teams/', ('team_stats_all')),

在视图中它看起来像:

def team_stats(request, incoming_team):
    queryset = Team.objects.get(name=incoming_team)

显然,您现有的视图将用于所有人。我还要注意你需要一些 Try/Except 处理,以防你有重复的团队,或者你请求的团队不存在。

(实际上我并没有像这样将它们拆分成单独的视图,但它可以让您了解逻辑流程)

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2011-05-27
    相关资源
    最近更新 更多