#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')