Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询关系_Python_Django_Python 3.x - Fatal编程技术网

Python Django查询关系

Python Django查询关系,python,django,python-3.x,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 = model

我的模型:

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

我该怎么做?最简单、最优雅的表单…

我唯一能想到的就是使用
values\u list
返回您想要的任何字段:

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

它可能比serializer不太方便,但我认为serializer不擅长处理外键关系,因为如果您需要在结果中包含更深层次的关系,该怎么办?

是什么让您认为外键不是对象?@ShangWang我可能没有正确解释自己。在foreingKey对象中,我想返回Category.name,但是当我查询Product.objects.all()时,Category属性会给我一个对应于指定类别的整数。我将以JSON字符串的形式返回,所以我需要这个category.name allready填充..你需要编辑你的帖子,向我们展示你是如何尝试转换为JSON的。你的问题写得毫无意义,因为它基于一个错误的前提。如果您循环使用
Product.objects.all()
,则每个
Product.category
将是一个category对象,而不是一个整数。我编辑了我的问题,我可能会更清楚。您的观点是正确的。我以为序列化程序会序列化我的“主”对象及其关系对象,但实际上不会。我会试试你的方法。@Pavarine我现在不在可以测试的地方,但如果你接着序列化会发生什么?@Two Bitalchest这是一个很好的尝试,但仍然不起作用。select_related将创建连接以立即从数据库中获取所有必要的数据,但序列化程序实际上不会“获取”返回的数据并构建相关对象。最后,我使用序列化程序的自然_键实现了这一点。。谢谢大家的帮助