将QuerySet作为JSON返回。使用values()函数会导致缺少值

时间:2017-03-16 17:14:42

标签: python json django django-models

我想从下面显示的模型中获取数据。 class ModelItem应该返回return语句中的所有4个值。

class ModelItem(models.Model):
    """Stores item names for user"""
    item_owner = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    item_name = models.TextField(max_length=100, null=True)

    def __unicode__(self):
        return "{0}, {1}, {2}, {3}".format(
                                        self.pk,
                                        self.item_owner.pk,
                                        self.item_owner.username,
                                        self.item_name,
                                      )

在views.py下面的代码可以工作。我得到了类' ModelItem'正在回归

user_id = 2
get_data = ModelItem.objects.filter(item_owner=user_id)
context = {'user_items': get_data}
return render(request, 'itemrequests.html', context)

结果(项目的pk,item_owner的pk,item_owner的用户名,item_name):

<QuerySet [<ModelItem: 1, 2, app_user, 2h-Axe>, <ModelItem: 2, 2, app_user, Ball of fire>]>

但是如果试图用JSON返回数据(因此必须使用 .values()

user_id = 2
get_data = ModelItem.objects.filter(item_owner=user_id).values()
return JsonResponse({'results': list(get_data)})

结果(缺少用户名):

{"results": [{"item_name": "2h-Axe", "item_owner_id": 2, "id": 1}, {"item_name": "Ball of fire", "item_owner_id": 2, "id": 2}]}

我无法找出造成这种情况的原因。这是我从模型或其他东西返回数据的方式吗?

解决

Ok所以为了从模型中返回自定义数据,我将Djangos默认用户模型切换为自定义用户模型,方法是将此类添加到models.py:

class SiteUser(AbstractUser):

    def natural_key(self):
        return (self.username, self.pk)

为了让django开始使用我的新自定义用户模型,我还在settings.py中添加了以下内容:

AUTH_USER_MODEL = 'homepage.SiteUser'

这样我仍然使用默认的用户模型作为基础,只是添加内容。在这个类中,我添加了natural_key() - 方法,它返回用户的用户名和主键。

在我将外键指向用户的其他模型中,我做了以下更改:

models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)

在我的views.py中,我使用了以下内容:

user_id = 1
get_data = ModelItem.objects.select_related('item_owner').filter(item_owner=user_id)
ser_data = serializers.serialize("json", get_data, use_natural_foreign_keys=True)
return HttpResponse(ser_data, content_type="application/json")

结果:

[{"model": "homepage.modelitem", "pk": 1, "fields": {"item_owner": ["Murzum", 1], "item_name": "2h-Axe"}}, {"model": "homepage.modelitem", "pk": 2, "fields": {"item_owner": ["Murzum", 1], "item_name": "Ball Of fire"}}]

现在我有item_owner的用户名和pk值。 现在还要了解django Manager interface

1 个答案:

答案 0 :(得分:1)

方法__unicode____str__仅用于在打印对象时进行表示,但这并不意味着如果返回实例将以这种方式工作。您必须返回所需的信息serializing数据。

编辑:您还可以使用select_related方法以避免额外查询。

ModelItem.objects.select_related('item_owner').filter(item_owner=user_id)