Django Get() 返回多个对象

Django Get() Returned More Than One Object

我收到以下错误:

get() returned 不止一个清单 -- 它 returned 2!

我知道这是因为数据库中有多个具有相同值的记录,但我想 return 所有这些记录,所以我假设我需要使用 .get 以外的东西,但我我不确定 what/how。

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 行。数据库中有多个相同 "reference" 的记录,因此不会打印。所以我的问题分为两部分:

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

2) 我怎样才能访问这些记录来代替 "manifest.description"

get 预期 returns 具有所需标准的单项 ,否则(不超过一个)引发异常。如果您想 select 任意数量的项目 符合所需的条件,您可以使用 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)

然后您可以迭代 selected 清单并使用 点符号.

获取每个清单相关字段的值
for manifest in manifest_queryset:
    print(manifest.description)

您还可以使用 values_list.

获取描述列表
description_list = manifest_queryset.values_list('description', flat=True)

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

要获取多个数据,您可以使用 过滤器 属性.

order = Orders.objects.all().filter(reference=reference)
manifest = Manifest.objects.all().filter(reference=reference)

对于您的第一个问题,您可以使用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() returns a queryset.So 您可以通过遍历查询集或索引来访问数据。

for data in manifest:
  print(data.description)

For your information get() returns an object and throws an exception if no object is found while filter() returns an empty list.

使用 filter() 而不是 get()

但是过滤器 returns 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

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

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

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

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