Django Get()返回的不只一个对象

时间:2019-06-07 11:59:09

标签: python django reportlab

我收到以下错误:

get()返回了多个清单-返回了2个!

我理解这是因为数据库中有多个具有相同值的记录,但是我想返回所有这些记录,因此我假设我需要使用.get以外的其他内容,但是我不确定是什么/

def write_pdf_view(request):

    if request.method == 'POST':
        reference = request.POST.get('Reference_IDs') 
        y = Orders.objects.all()
        z = Manifests.objects.all()
        order = y.get(reference=reference)
        manifest = z.get(reference=reference)

....

....

#Manifest
    p.drawString(30,620,'MANIFEST: ')
    p.drawString(30,605,manifest.description)

问题是manifest.description行。数据库中有多个具有相同“引用”的记录,因此它们将不会打印。所以我的问题是2个部分:

1)如何更改manifest = z.get(reference = reference),以便可以访问多个记录

2)然后我该如何代替“ manifest.description”来访问这些记录

5 个答案:

答案 0 :(得分:1)

get期望返回具有所需条件的单个项目,否则(不超过一个)引发异常。如果要选择具有所需条件的任意数量的项目,则可以改用filter

def write_pdf_view(request):
    if request.method == 'POST':
        reference = request.POST.get('Reference_IDs') 
        manifest_queryset = Manifests.objects.filter(reference=reference)
        order = Orders.objects.get(reference=reference)

然后,您可以使用点符号迭代选定的清单,并获取每个清单相关字段的值。

for manifest in manifest_queryset:
    print(manifest.description)

您还可以使用values_list获取描述列表。

description_list = manifest_queryset.values_list('description', flat=True)

您可以在QuerySet API reference中获得更多信息。

答案 1 :(得分:0)

要获取多个数据,可以使用 filter 属性。

BodyPublisher

答案 2 :(得分:0)

对于第一个问题,您可以使用| number | type | |--------|------| | 1 | A | | 4 | A | | 5 | A | | 2 | B | | 3 | B | 方法从模型中获取特定记录。

filter()

对于第二个问题,def write_pdf_view(request): if request.method == 'POST': reference = request.POST.get('Reference_IDs') manifest = Manifests.objects.filter(reference=reference) order = Orders.objects.get(reference=reference) 返回查询集。因此,您可以通过遍历查询集或索引来访问数据。

filter()
  

作为参考,get()返回一个对象,如果在filter()返回空列表时未找到对象,则抛出异常。

答案 3 :(得分:0)

使用filter()代替get()

但是过滤器返回的是 queryset 而不是 object 。因此,您必须遍历查询集。

def write_pdf_view(request):
    if request.method == 'POST':
       reference = request.POST.get('Reference_IDs') 
       y = Orders.objects.all()
       z = Manifests.objects.all()
       order = y.get(reference=reference)
       manifest = z.filter(reference=reference)
       for manifest_value in manifest:
           print(manifest_value.description)

有关查询集的更多详细信息,请参见QuerySet API

答案 4 :(得分:0)

要通过唯一字段获取特定项目,可以使用get。如果找不到任何对象,将引发DoesNotExist

order = Orders.objects.get(pk=reference)

如果要使用对象列表,请使用filter。如果找不到,将默认为[]

manifest = Manifest.objects.filter(reference=reference)