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



我想从下面显示的模型中获取数据.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,下面的代码有效。我得到类"模型项"返回的所有值

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

结果如下(项目包、item_owner包、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}]}

我无法找出导致这种情况的原因。是我从模型返回数据的方式还是其他方式?

解决

好的,为了从模型中返回自定义数据,我通过将此类添加到 models.py,从使用 Django 的默认用户模型切换到自定义用户模型:

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 管理器界面

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

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

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

相关内容

最新更新