Как извлечь объект с несколькими уровнями обратного поиска

#django #django-shell

Вопрос:

В моем проекте есть три модели:

 class Level1(models.Model):
        name = models.CharField(max_length=250)


class Level2(models.Model):
        name = models.CharField(max_length=250)
        level1 = models.ForeignKey(Level1, on_delete=models.RESTRICT)

class Level3(models.Model):
        name = models.CharField(max_length=250)
        level2 = models.ForeignKey(Level2, on_delete=models.RESTRICT)

 

Модель уровня 1 имеет 2 объекта WA , TX . Уровень 2 содержит 5 объектов AAA , BBB где находится внешний ключ WA ; и AAA , CCC , DDD где находится внешний ключ TX .

В Level3 я хочу добавить объект RRRR , в котором находится объект внешнего ключа Level2 AAA .

Когда я попытался получить Level2.objects.get(name='AAA') уровень 2, он показывает ошибку get() returned more than one Level2 -- it returned 2!

Как решить эту проблему. Заранее спасибо.

Комментарии:

1. вы фильтруете уровень 2 по имени атрибута, который не является уникальным

Ответ №1:

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

 Level2.objects.filter(name='AAA')
 

Комментарии:

1. это приведет к извлечению 2 объектов level2, которые имеют внешний ключ к другому объекту level1. Я хочу добавить один объект в модель Level3.

Ответ №2:

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

 Level2.objects.filter(name='AAA', level1__name='WA') or 
Level2.objects.filter(name='AAA', level1__name='TX')
 

Комментарии:

1. Он показывает: «Значение набора запросов для точного поиска должно быть ограничено одним результатом с использованием среза»..

Ответ №3:

Альхамдулилла, наконец-то я решаю проблему, комбинируя фильтр и get.

 Level2.objects.filter(level1__name='WA').get(name='AAA')