2017-03-16 56 views
0

我想從下面顯示的模型中獲取數據。類ModelItem應該返回return語句中的所有4個值。將QuerySet返回爲JSON。使用values()函數導致缺失值

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下面works.I的代碼獲得所有的值該類的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}]} 

我無法找出是什麼原因造成這一點。這是我從模型或其他東西返回數據的方式嗎?

解決

確定,所以爲了從模型返回定製數據我使用Django的默認用戶模式,自定義用戶模式切換加入這個類的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

方法__unicode____str__僅用於表示,當你打印一個對象,它並不意味着,如果你返回一個實例會以這種方式工作。你必須返回你需要的信息serializing的數據。

編輯:也可以使用select_related方法,以避免額外的查詢。

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