【问题标题】:DRF: listview get works, detailview returns empty responseDRF:listview 得到工作,detailview 返回空响应
【发布时间】:2016-01-28 11:40:31
【问题描述】:

请多多包涵。我在做一些愚蠢的事情,但我不知道是什么。

我正在适应/遵循 Django Rest Framework 的教程。

我正在使用教程的序列化部分来返回用户(列表和详细视图)。

我的列表视图(列出所有用户)完美运行。

我的详细视图没有。我可以看到序列化程序实例正在填充详细信息视图的用户,但是 serializer.data 是空的。

没有返回错误,只是一个空回复{}。

我做错了什么?

这行得通:

@csrf_exempt
def parentList(request):
    """
    List all parents or create a new parent
    """
    if request.method == 'GET':
        theseParents = PlatformUser.objects.all()
        serializer = parentSerializer(theseParents, many=True)
        return baseJSONResponse(serializer.data)

来自序列化程序的 sn-p:

class parentSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlatformUser
        fields = ('pk', 'email', 'first_name', 'last_name', 'phone', 'home_address_1', 'home_address_2', 'city', 'country', 'home_postcode', 'photo', 'overview')

这不起作用(serializer.data 为空,但已填充序列化程序):

def parentDetails(request, pk):
    """
    Retrieve or update a parent record
    """
    try:
        thisParent = PlatformUser.objects.filter(pk=pk)
    except thisParent.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer=parentSerializer(thisParent)
        return baseJSONResponse(serializer.data)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您的查询集似乎是空的。

    "Except DoesNotExists" 对过滤器毫无用处。如果没有选择 thisParent 的对象将是空查询集但不会引发异常。

    如果要在不存在的对象上获取 404 并将对象作为查询集传递给序列化程序,则需要像这样重写代码。

    thisParent = PlatformUser.objects.filter(pk=pk)
    if not thisParent.exists():
        return HttpResponse(status=404)
    

    我建议您使用来自 Rest Framework 的通用视图。

    【讨论】:

    • 谢谢 - 我不认为我的查询集是空的......对于上面代码中的最后一行 return baseJSONResponse(serializer.data) 我可以看到 serializer 有一个有效的查询集(有一个用户在列表符合预期),但是 serializer.data 是空的,它不应该是......另外,我正在查询已知用户的主键。
    • 传递给序列化程序实例而不是查询集 serializer=parentSerializer(thisParent[0])更好 重写您的代码以使用一个对象,而不是查询集 thisParent = PlatformUser.objects.get(pk=pk)
    • 这就是问题所在——我向它发送了一个查询集,它实际上需要一个实例。您能否将您的评论(“传递给序列化程序......”)转换为答案,我会将其标记为已接受?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多