2016-02-18 67 views
2

我的模型:Django的查詢關係

class Product(models.Model): 
    name = models.CharField(max_length=125, blank=False, null=False) 
    description = models.CharField(max_length=255, blank=True) 
    abbreviation = models.CharField(max_length=15, blank=True) 
    category = models.ForeignKey('inventory.Category', 
     on_delete=models.SET_NULL, null=True, blank=True) 
    metric = models.CharField(max_length=15, blank=True, null=True) 


class Category(models.Model): 
    name = models.CharField(max_length=55, blank=False, null=False) 
    abbreviation = models.CharField(max_length=15, blank=True) 
    parent_category = models.ForeignKey('inventory.Category', 
     on_delete=models.SET_NULL, null=True, blank=True) 

我要收回所有產品:

產品= Product.objects.all()

這是確定。我獲得了所有成功的產品。

但我希望返回的產品帶有ForeignKey屬性作爲引用模型的文本字段,並且不包含引用它的原始整數。

有問題的字段將是Category.name。

目前我的回報是:

{model: product, pk:1, fields: {..., category: 1} }, { ....... } ... 

我想:

{model: product, pk:1, fields: {..., category: 'Categoria 1 '} 

我需要一套預先填入相關的模型信息,因爲我會返回一個JSON字符串作爲服務調用者的結果。

我試圖返回JSON:

products = Product.objects.all() 
serialized_products = serializers.serialize('json', products) 
return JsonResponse({'result': 'success', 'data':serialized_products}) #return all 

我怎樣才能做到這一點?最簡單,最優雅的形式...

+0

是什麼讓你認爲外鍵不是一個對象? –

+0

@ShangWang我可能沒有正確解釋自己。在foreingKey對象中,我想返回** Category.name **,但是當我查詢Product.objects.all()時,**類別**屬性給了我對應於指向類別的整數。我將把它作爲JSON字符串返回,所以我需要這個** category.name ** allready填充。 – Pavarine

+0

您需要編輯您的帖子以向我們展示您是如何嘗試轉換爲json的。 –

回答

1

我能想到的唯一的事情就是用values_list回到你想要的任何字段:

products = Product.objects.all().values('name', 
             'description', 
             'category__name', 
             'category__id', 
             'category__abbreviation') 
return JsonResponse(products) 

這可能是有點不太方便於是串行,但我不不認爲序列化器善於處理外國的關鍵關係,因爲如果你需要在結果中包含更深的關係,那該怎麼辦?

+0

你的觀點是正確的。我認爲序列化程序會序列化我的「主要」對象及其關係對象,但顯然不是。我會試試你的方式。 – Pavarine

+0

@Pavarine我不是我現在可以測試的地方,但是如果你['select_related']會發生什麼(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db。 models.query.QuerySet.select_related)然後序列化? –

+0

@ Two-BitAlchemist我也會試試你的... – Pavarine