Django Get () вернул более одного объекта - PullRequest
0 голосов
/ 07 июня 2019

Я получаю следующую ошибку:

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 ]

1 голос
/ 07 июня 2019

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 .

0 голосов
/ 07 июня 2019

, чтобы получить конкретный предмет по уникальным полям, которые вы можете использовать get. поднимет DoesNotExist, если объект не найден.

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

, если вы хотите список объектов, используйте filter. по умолчанию будет [], если не найдется.

manifest = Manifest.objects.filter(reference=reference)
0 голосов
/ 07 июня 2019

Используйте 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)

Подробнее о наборе запросов см. API QuerySet

0 голосов
/ 07 июня 2019

В качестве первого вопроса вы можете использовать метод 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() возвращает набор запросов. Таким образом, вы можете получить доступ к данным, просматривая набор запросов или по индексу.

for data in manifest:
  print(data.description)

Для вашей информации get () возвращает объект и выдает исключение, если объект не найден, а filter () возвращает пустой список.

0 голосов
/ 07 июня 2019

Для получения нескольких данных вы можете использовать свойство filter .

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