Django查询关系

时间:2016-02-18 18:21:30

标签: python django python-3.x

我的模特:

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)

我想恢复所有产品:

products = 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

我该怎么做?最简单优雅的形式......

1 个答案:

答案 0 :(得分:1)

我唯一能想到的是使用values_list返回你想要的任何字段:

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

它可能比串行器更不方便,但我不认为序列化器擅长处理外部关键关系,因为如果你需要在结果中包含更深层的关系呢?